原型继承: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"
还在执行。
这种情况背后有实际原因吗?
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)
时,查找链如下:
constructor
在child_2
吗? -- NO,按照[[Prototype]]
- 我们降落在这个 object,(这是
Parent
class 的 "instance"。 constructor
在吗? -- 没有,按照[[Prototype]]
- 我们现在在
Parent.prototype
object,constructor
在吗? - - 是的! return它。
我建议将 child 的原型设置为 Object.create()
,而不是使用 new
,但我想关于这个问题,这既不是这里也不是那里。无论如何,您需要手动设置 constructor
属性,如文档中所述。
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = 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"
还在执行。
这种情况背后有实际原因吗?
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)
时,查找链如下:
constructor
在child_2
吗? -- NO,按照[[Prototype]]
- 我们降落在这个 object,(这是
Parent
class 的 "instance"。constructor
在吗? -- 没有,按照[[Prototype]]
- 我们现在在
Parent.prototype
object,constructor
在吗? - - 是的! return它。
我建议将 child 的原型设置为 Object.create()
,而不是使用 new
,但我想关于这个问题,这既不是这里也不是那里。无论如何,您需要手动设置 constructor
属性,如文档中所述。
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;