原型继承:孩子的构造者

时间:2015-07-31 10:46:40

标签: javascript prototypal-inheritance

我正在玩原型继承,并碰到了一些我发现有点了不起的东西。情况就是这样:

function Parent(){ 
    this.name = "parent"; 
    this.age = 30; 
}; 

var parent = new Parent();  
console.log(parent.constructor); //Prints function Parent();

function Child(){
    this.name = "child"; 
    this.age = 10; 
}; 

var child = new Child(); 
console.log(child.constructor); //prints function Child() 

Child.prototype = new Parent(); //Set inheritance 
console.log(Child.prototype.constructor); //prints function Parent() as expected 

var child_2 = new Child(); 
console.log(child_2.constructor); //prints function Parent() ?? 

console.log(child_2.name); //Yet prints child, meaning the child's constructor is still function Child() 

虽然定义继承之后Child的构造函数是function Parent()并不感到惊讶,但我对child_2的构造函数为function Parent()感到有些惊讶,因为属性在Child的构造函数体中设置,即。

this.name = "child"  

仍然执行。

这种情况背后有实际原因吗?

http://jsfiddle.net/7yobzt0u/1/

1 个答案:

答案 0 :(得分:1)

Docs稍微触及了这一点,但大多只是参考this SO question的答案。

如您所见,constructor是函数prototype上的属性,而不是对象本身。 myObj.constructor返回内容的唯一原因是因为myObj [[Prototype]] 指向其构造函数的prototype属性。

当你说:child.prototype = new Parent()时,你Child.prototype指向父“类”的“实例”。

然后,当你说child_2 = new Child()该实例被复制到child_2 [[Prototype]]

所以当你说console.log(child_2.constructor)时,查询链如下:

  1. constructor中有child_2吗? - 不,请按照 [[Prototype]]
  2. 进行操作
  3. 我们登陆了这个对象,(Parent类的“实例”)。 constructor在这里吗? - 不,请按照 [[Prototype]]
  4. 进行操作
  5. 我们现在在Parent.prototype对象中,constructor在这里? ---是的!把它返还。
  6. 我没有使用new,而是建议用Object.create()设置孩子的原型,但我想在这个问题上并不存在。无论如何,您需要手动设置constructor属性,如文档中所述。

    Child.prototype = Object.create(Parent.prototype); 
    Child.prototype.constructor = Child;