通过定义一个含有this的特殊的函数,来初始化一个对象的属性,这个函数被称为constructor—构造函数,通常也把这个函数的定义看做是类定义。按Javascript的规范,这样的函数通常用名词来命名,表示一种类型,如本文中的例子Rectangle。我们知道Javascript中的函数,其实也是对象,这点通过 Rectangle instanceof Object == true可以证明。所以如前面提到的,Javascript的类机制实际上是用对象来实现的。
不过这样调用写法是很麻烦的,我们可以直接rect1.area()来调用。Javascript内置了属性和方法的查找机制,首先看rect1对象本身是否有area方法,这里是没有的,然后Javascript会看这个对象的constructor.prototype对象是否有这个area方法,于是找到了方法定义,就可以执行调用了,如果在这个对象的constructor.prototype中没有,Javascript会看constructor.prototype是否还有constructor.prototype属性,如果有的话,会继续这样的查找,直到找到,或者达到Object.prototype,这就是所谓的prototype chain。
为什么呢?问题出在这里ColoredRectangle.prototype = Rectangle.prototype,这行代码将父类的prototype赋值给子类了,也就是说子类和父类的prototype指向了同一个对象,所以子类增加方法,父类也就有了。还记得前面说的prototype.constructor.prototype吧,我们可以再子类和父类的prototype中间在加一个对象,这样就实现了父类和子类prototype的分离了。
|