gpt4 book ai didi

javascript - 如果未覆盖构造函数属性,为什么对象的构造函数属性指向父构造函数而不是扩展函数中的 F

转载 作者:行者123 更新时间:2023-11-29 21:57:54 24 4
gpt4 key购买 nike

我正在辨别著名的 JS 的 extend 函数:

function extend(parent, child) {
var F = new Function();
F.prototype = parent.prototype;
child.prototype = new F();
//child.prototype.constructor = Child
}

我已经注释掉了构造函数属性被覆盖的那一行。如果我按以下方式创建对象:

var p = function p() {this.parent = true};
var c = function c() {this.child = true};
extend(p, c);
console.log((new c()).constructor); //outputs reference to `p` constructor, why?

我的问题是为什么构造函数引用 var p = function p() {this.parent = true}; 而不是变量 F 指向的匿名函数?关于构造函数属性的手册指出,constructor 属性返回对创建实例原型(prototype)的 Object 函数的引用,而实例原型(prototype) new F() 是由匿名函数创建的。那么为什么它指向另一个东西呢?

更新

我根据 HMR 的回答做出的以下假设是否正确?
当创建一个新函数时,JS 引擎创建一个新的空对象,并设置函数的 prototype 属性指向这个新创建的对象。然后JS引擎给这个对象添加一个constructor属性指向创建的函数。

现在谈谈我的情况。当 var F = new Function() JS 引擎时:
1) 创建新的 F 函数
2)创建新对象(让它成为oF)
3) 设置原型(prototype) F.prototype = oF
4) 设置构造函数 oF.constructor = F

function p 也是如此,它的原型(prototype) oP 的构造函数属性设置为 function p。正如我们所记得的,F.prototype 指向 oF 但在我们执行以下行之后 F.prototype = parent.prototype 它现在指向oP。然后当我们访问 (new c()).constructor 属性时 new c() 对象没有它所以 JS 引擎开始向后看原型(prototype)并找到属性oP 指向 function p - 这正是我得到的结果。

最佳答案

如果在实例上找不到成员,那么 JS 引擎将在原型(prototype)链中查找。原型(prototype)链是一堆对象,它们具有另一个对象的 __proto__ 直到它为空。

请注意,__proto__ 是一个非标准属性,此处用于解释原型(prototype)链中首先使用的对象。

由于您将 child.prototype 替换为具有 __proto__ of parent.prototype 的空对象,因此 JS 引擎无法在 c 上找到构造函数,child.prototype 但随后它'我们会在 child.prototype.__proto__ 上找到它,它是 parent.prototype。

当你这样做时:

child.prototype.constructor=child;

它将它添加到 child.prototype,因此它不会改变 child.prototype.__proto__ 中的 parent.prototype。这称为阴影。

更多关于原型(prototype)和构造函数的信息 here .

[更新]

继承后的原型(prototype)链是这样的:

insance of child (new c())
=> c.prototype === new F() so an empty object
=> p.prototype, set when you did F.prototype=parent.prototype

关于javascript - 如果未覆盖构造函数属性,为什么对象的构造函数属性指向父构造函数而不是扩展函数中的 F,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25429409/

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