如何在javascript中显示委托的“构造函数”引用问题?

如何在javascript中显示委托的“构造函数”引用问题?,javascript,Javascript,在下面的例子中,我注意到了“修复了委托构造函数引用”的注释,我很好奇——我怎么能显示“在添加了那行javascript之后不工作/然后工作?” 此处的完整要点=> 先谢谢你 function Foo(who) { this.me = who; } Foo.prototype.identify = function() { return "I am " + this.me; }; function Bar(who) { Foo.call(this,"Bar:" + wh

在下面的例子中,我注意到了“修复了委托构造函数引用”的注释,我很好奇——我怎么能显示“在添加了那行javascript之后不工作/然后工作?”

此处的完整要点=>

先谢谢你

function Foo(who) {
    this.me = who;
}

Foo.prototype.identify = function() {
    return "I am " + this.me;
};

function Bar(who) {
    Foo.call(this,"Bar:" + who);
}

Bar.prototype = Object.create(Foo.prototype);
Bar.prototype.constructor = Bar;    // "fixes" the delegated `constructor` reference

javascript中的函数实际上是对象。当我们在javascript中创建任何函数
Foo
时,解释器会自动创建一个
prototype
属性
Foo.prototype
,它本身就是一个对象。然后解释器会在此对象上创建一个
constructor
属性,该属性引用
Foo
本身:

console.log(Foo.prototype.constructor);                   // reference to Foo;
console.log(Foo.prototype.hasOwnProperty("constructor")); // TRUE;
当我们创建
Bar
函数时,也会发生同样的过程。但后来我们引入了一个区别。区别在于我们在
Bar手动覆盖对象。prototype
使用以下代码:

Bar.prototype = Object.create(Foo.prototype);
现在,
Bar.prototype
有一个我们手动创建的新对象。这个新对象没有
构造函数
属性,因为它是由我们而不是解释器创建的:

console.log(Bar.prototype.hasOwnProperty("constructor")); // FALSE
因此
Bar.prototype
没有自己的
constructor
属性,但是
Foo.prototype
有。接下来,假设我们创建了
Bar
的一个实例:

var myBar = new Bar();
myBar.constructor
是继承的属性,在
myBar
对象上不存在。如果我们试图访问它,javascript解释器会在原型链上搜索
constructor
属性。它在
Bar.prototype
上找不到属性,因为我们重写了该对象。解释器继续执行搜索并最终在
Foo.prototype
上找到属性。因此,对
myBar.constructor
的任何引用都将引用
Foo.prototype.constructor
,其中包含对
Foo
的引用:

console.log(myBar.constructor); // reference to Foo
因此,这就是为什么我们显式地手动设置
Bar.prototype.constructor
,以便在遍历原型链时,解释器将在
Bar.prototype
上找到
constructor
属性,就像我们没有覆盖它一样:

Bar.prototype.constructor = Bar;
最终的结果是在我们的对象上有更有用的行为:

var myBar2 = new Bar();
console.log(myBar2.constructor); // reference to Bar

这个问题不应该经常出现,因为很少有人需要检查对象的
构造函数
属性。

感谢您的洞察力。现在的问题是何时、为什么以及在什么情况下使用
构造函数
属性。为什么需要检查构造函数属性?我还没有看到一个p该财产的实际使用案例。与其说是任何实际使用,不如说是适当的簿记,IMHO。