如何在javascript中显示委托的“构造函数”引用问题?
在下面的例子中,我注意到了“修复了委托构造函数引用”的注释,我很好奇——我怎么能显示“在添加了那行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
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。