我正在玩原型继承,并碰到了一些我发现有点了不起的东西。情况就是这样:
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"
仍然执行。
这种情况背后有实际原因吗?
答案 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)
时,查询链如下:
constructor
中有child_2
吗? - 不,请按照 [[Prototype]]
Parent
类的“实例”)。 constructor
在这里吗? - 不,请按照 [[Prototype]]
Parent.prototype
对象中,constructor
在这里? ---是的!把它返还。 我没有使用new
,而是建议用Object.create()
设置孩子的原型,但我想在这个问题上并不存在。无论如何,您需要手动设置constructor
属性,如文档中所述。
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;