为什么javascript函数原型需要修复构造函数?
比如说。当他们将对象分配给函数的原型时,我通常会看到JQuery源代码或其他javascript框架源代码,他们通常这样做:为什么javascript函数原型需要修复构造函数?,javascript,jquery,constructor,Javascript,Jquery,Constructor,比如说。当他们将对象分配给函数的原型时,我通常会看到JQuery源代码或其他javascript框架源代码,他们通常这样做: function A(){} A.prototype = { constructor: A, // .... } 我真的很困惑。我的意思是为什么它必须这样做?在JavaScript中,所有正常创建的函数都有一个prototype属性,它最初是由JavaScript引擎创建的一个对象,具有一个属性:构造函数,它引用回函数。所以 function A() {
function A(){}
A.prototype = {
constructor: A,
// ....
}
我真的很困惑。我的意思是为什么它必须这样做?在JavaScript中,所有正常创建的函数都有一个
prototype
属性,它最初是由JavaScript引擎创建的一个对象,具有一个属性:构造函数,它引用回函数。所以
function A() {
}
…我们知道,最初,A.prototype.constructor===A
。这也意味着通过新建的
创建的对象将继承构造函数
,因此:
var o = new A();
console.log(o.constructor === A); // true
但是,如果像代码片段那样,将prototype
属性上的对象替换为其他对象,则新事物的构造函数
属性(它继承的属性)指向错误的函数,除非修复它:
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
但是构造函数
属性的意义是什么?实际上,JavaScript规范中没有任何内容使用过该属性;唯一提到的是上面提到的,确保prototype
属性上的初始对象有constructor
引用回函数
但是一些代码(包括一些库)可能会假设构造函数设置“正确”(例如,JavaScript引擎默认设置的方式),并可能尝试使用它来确定对象“是什么”(虽然通常很少有理由这样做;在极少数情况下,当您真正关心时,instanceof
通常是更好的检查方法,因为它允许派生对象)。或者他们可能尝试在克隆操作中使用它,尽管从ES5开始有更好的方法
在任何情况下,由于存在(很少)代码可能依赖于JavaScript引擎设置的构造函数
属性,因此良好的代码替换原型
属性完全以JavaScript引擎相同的方式设置构造函数
,以防万一
实际上,人们在替换prototype
属性上的对象时通常会忽略这一步骤,因此在新代码中依赖构造函数并不是最佳做法。但确保正确设置构造函数可能仍然是,以防万一。这可能会回答您的问题: