转载请注明出处----在河东
砖头书中有道: 在默认情况下,所有原型对象都会自动获得一个 Constructor (构造函数)属性,这个属性
是指向prototype 属性所在函数的指针。 (听起来确实有点懵逼)
书中示例:
function Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = functon(){
console.log(this.name);
}
大概就说明了constructor是指向它的类的(默认情况下)
好了,下面我们来看看下面的继承:
function SuperType(name){
this.name = name;
this.colors = ["red","blue","green"];
}
SuperType.prototype.sayName = function(){
console.log(this.name);
}
function SubType(name , age){
SuperType.call(this,name);
this.age = age;
}
/**12行*/SubType.prototype = new SuperType();
//留意下面这一句的作用
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function(){
console.log(this.age);
}
var instance1 = new SubType("HEDONGHUI",22);
instance1.colors.push("black");
console.log(instance1.colors);
instance1.sayName();
instance1.sayAge();
var instance2 = new SubType("heod",23);
console.log(instance2.colors);
instance2.sayName();
instance2.sayAge();
注释掉 SubType.prototype.constructor = SubType; 后的结果:
会发现,去掉这句instance1 , instance2 还是能调用Subtype类构造函数并能成功得出想要的结果。那么问题来了,这句话在原型继承中的作用是什么呢?
从前文我们知道,原型的constructor 默认指向原对应的类型。第12行执行完后,SubType原型(SubType.prototype)
指向了SuperType的实例对象,而SuperType的实例对象的构造器是构造函数SuperType,所以
SubType.prototype.constructor就是构造对象SuperType了(换句话说,SuperType构造了SubType的原型)。
这里实例instance1 ,SubType.prototype.constructor都为 SuperType。这就导致了
SubType.prototype === instance1.constructor.prototype 为false; 这样会令人产生费解,既然在一开始中
(前文)说到原型指向所在的类型,一般情况下,instance1.constructor为SubType 。 SubType.prototype ===
SubType.prototype的。 由于第12行代码实现了,SubType 继承 SuperType导致了 SubType.prototype.constructor
指向了SuperType(),因此,这行代码的作用就是为了修正因为继承SuperType对象所有成员后,SubType的构造器也指向了SuperType.
那么,为什么注释掉也能正确调用SubType()构造函数去实例化instance1呢?
虽然instance1.constructor ===SuperType() 返回true, 但对于执行第12行来说,SubType.prototype实例化了
继承来的父类的方法和属性。在 instance1 = new SubType("heodnghui",22)中,instance1.__proto__由于
SubType.prototype指向了SuperType 而被修改为 SuperType。 因此也获得了父类继承来的属性和方法
(尽管constructor也指向了SuperType)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。