gpt4 book ai didi

javascript - 原型(prototype)继承 : constructor of child

转载 作者:行者123 更新时间:2023-11-30 00:25:03 25 4
gpt4 key购买 nike

我正在研究原型(prototype)继承,并遇到了一些我发现有点不同寻常的东西。情况是这样的:

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_2function Parent(),因为在Child的构造函数体中设置的属性,即。

this.name = "child"  

仍然执行。

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

http://jsfiddle.net/7yobzt0u/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. 我们登陆了这个对象(它是 Parent 类的“实例”)。 constructor 在这里吗? -- 不,遵循[[Prototype]]
  3. 我们现在在 Parent.prototype 对象中,constructor 在这里吗? - - 是的!把它返还。

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

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

关于javascript - 原型(prototype)继承 : constructor of child,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31744292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com