原型继承:child的构造函数

Prototypical inheritance: constructor of child

我在玩原型继承,碰到了一些我觉得有点不同寻常的东西。情况是这样的:

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/

Docs touch on this a little bit, but mostly just reference this SO question为答案。

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

当您说:child.prototype = new Parent() 时,您 Child.prototype 指向 parent "class" 的 "instance"。

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

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

  1. constructorchild_2吗? -- NO,按照[[Prototype]]
  2. 我们降落在这个 object,(这是 Parent class 的 "instance"。 constructor在吗? -- 没有,按照[[Prototype]]
  3. 我们现在在Parent.prototypeobject,constructor在吗? - - 是的! return它。

我建议将 child 的原型设置为 Object.create(),而不是使用 new,但我想关于这个问题,这既不是这里也不是那里。无论如何,您需要手动设置 constructor 属性,如文档中所述。

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