为什么javascript函数原型需要修复构造函数?

为什么javascript函数原型需要修复构造函数?,javascript,jquery,constructor,Javascript,Jquery,Constructor,比如说。当他们将对象分配给函数的原型时,我通常会看到JQuery源代码或其他javascript框架源代码,他们通常这样做: function A(){} A.prototype = { constructor: A, // .... } 我真的很困惑。我的意思是为什么它必须这样做?在JavaScript中,所有正常创建的函数都有一个prototype属性,它最初是由JavaScript引擎创建的一个对象,具有一个属性:构造函数,它引用回函数。所以 function A() {

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

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
属性上的对象时通常会忽略这一步骤,因此在新代码中依赖
构造函数并不是最佳做法。但确保正确设置
构造函数可能仍然是,以防万一。

这可能会回答您的问题: