奇怪的javascript原型继承

Pet*_*kov 1 javascript prototype

JavaScript专家,这里有一个难题:

function aFunc(){}
function bFunc() {}
aFunc.prototype = bFunc.prototype;
a = new aFunc();
console.log(a instanceof bFunc); //true!
Run Code Online (Sandbox Code Playgroud)

为什么是a实例bFunc

如果是这样的话,我能理解这一点:

function aNext(){}
function bNext(){}
aNext.prototype = new bNext();
a = new aNext();
console.log(a instanceof bNext);
Run Code Online (Sandbox Code Playgroud)

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

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

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!
Run Code Online (Sandbox Code Playgroud)

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

Ble*_*der 5

来自MDN:

所述instanceof操作者测试是否一个对象在其原型链的prototype构造的性质.

所以在你的情况下,它测试是否bFunc.prototype在原型链中a.从那以后bFunc.prototype === a.prototype,它会回归true.