1

JavaScript 大师,这里有一个谜题给你:

function aFunc(){}
function bFunc() {}
aFunc.prototype = bFunc.prototype;
a = new aFunc();
console.log(a instanceof bFunc); //true!

为什么是a实例bFunc

如果是这样的话,我可以理解:

function aNext(){}
function bNext(){}
aNext.prototype = new bNext();
a = new aNext();
console.log(a instanceof bNext);

..但是原型对我来说似乎很奇怪。您可以在 Professional JavaScript for Web Developers 一书(第 6 章,最后几页)中找到上述原型代码的实际应用。

编辑: 感谢 Blender,但这里分别出现了新的谜题:现在如果我们有 2 个从单个相同对象继承的对象,它们是彼此的实例(但它们完全不同)!

function Horse(){} //class chain can be very long
function Pig(){}
Horse.prototype = Object.prototype;
Pig.prototype = Object.prototype;
a = new Pig();
console.log(a instanceof Horse); //true!

我们如何解决问题?如果它们都是动物(过去具有相同的原型),我如何确定猪不是马?

4

2 回答 2

5

来自MDN

instanceof运算符测试对象在其原型链中是否具有构造函数的属性prototype

因此,在您的情况下,它会测试是否bFunc.prototypea. 既然bFunc.prototype === a.prototype,它会回来true的。

于 2013-05-27T00:48:30.057 回答
0

答案是:pig_instance.prototype = Object.prorotype = horse_instance.prototype,所以 pig 和 horse 来自同一个原型,instanceof 对此进行检查并返回 TRUE。

于 2013-08-09T12:58:38.777 回答