gpt4 book ai didi

javascript - 为什么javascript函数原型(prototype)需要修复构造函数?

转载 作者:行者123 更新时间:2023-11-29 21:51:56 25 4
gpt4 key购买 nike

例如。当他们将对象分配给函数的原型(prototype)时,我通常会看到 JQuery 源代码或其他 javascript 框架源代码,他们通常这样做:

function A(){}
A.prototype = {
constructor: A,
// ....
}

我真的很困惑。我的意思是为什么它必须这样做?

最佳答案

在 JavaScript 中,所有正常创建的函数都有一个 prototype 属性,它最初是由 JavaScript 引擎创建的一个对象,它具有一个属性:constructor,它向后引用到功能。所以对于

function A() {
}

...我们知道,最初,A.prototype.constructor === A。这也意味着通过 new A 创建的对象将继承 constructor,因此:

var o = new A();
console.log(o.constructor === A); // true

但是,如果您替换 prototype 属性上的对象,就像您的代码片段所做的那样,那么新事物的 constructor 属性(它继承的)指向错误的函数,除非你修复它:

function A() {
}
A.prototype = {}; // Replace the object
var o = new A();
console.log(o.constructor === A); // false
console.log(o.constructor === Object); // true

糟糕。这就是为什么您引用的代码段在它分配给 A.prototype 的对象上设置 constructor

但是 constructor 属性有什么意义呢?实际上,JavaScript 规范中没有任何内容使用该属性;唯一提到的就是上面提到的,确保 prototype 属性上的初始对象有 constructor 引用回函数。

但一些代码(包括一些库)可能会假设 constructor 被“正确”设置(例如,JavaScript 引擎默认的方式),并且可能会尝试使用它来计算找出对象"is"什么(尽管通常很少有理由这样做;在极少数情况下,当您真正关心时,instanceof 通常是更好的检查方法,因为它允许派生对象).或者他们可能会尝试在克隆操作中使用它,尽管从 ES5 开始有更好的方法。

在任何情况下,由于那里有(罕见的)代码可能依赖于 JavaScript 引擎设置的 constructor 属性,所以行为良好的代码会替换 原型(prototype) 属性以与 JavaScript 引擎相同的方式完全设置 constructor,以防万一。

在实践中,人们很常见在替换 prototype 属性上的对象时省略该步骤,因此依赖于 constructor 在新代码中不是最佳实践。但确保您正确设置 constructor 可能仍然是,以防万一。

关于javascript - 为什么javascript函数原型(prototype)需要修复构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28692934/

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