奇怪的javascript原型继承

奇怪的javascript原型继承,javascript,prototype,Javascript,Prototype,JavaScript大师,这里有一个难题: function aFunc(){} function bFunc() {} aFunc.prototype = bFunc.prototype; a = new aFunc(); console.log(a instanceof bFunc); //true! 为什么是bFunc的一个实例 如果是这样的话,我可以理解: function aNext(){} function bNext(){} aNext.prototype = new bNext

JavaScript大师,这里有一个难题:

function aFunc(){}
function bFunc() {}
aFunc.prototype = bFunc.prototype;
a = new aFunc();
console.log(a instanceof bFunc); //true!
为什么
bFunc
的一个实例

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

function aNext(){}
function bNext(){}
aNext.prototype = new bNext();
a = new aNext();
console.log(a instanceof bNext);
…但对于原型,我觉得很奇怪。上面原型代码的实际应用可以在《面向Web开发人员的专业JavaScript》一书中找到(第6章,最后一页)

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

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

instanceof
操作符测试对象的原型链中是否包含构造函数的
prototype
属性

因此,在您的例子中,它测试
bFunc.prototype
是否在
a
的原型链中。由于
bFunc.prototype==a.prototype
,它将从以下位置返回
true

instanceof
操作符测试对象的原型链中是否包含构造函数的
prototype
属性

因此,在您的例子中,它测试
bFunc.prototype
是否在
a
的原型链中。由于
bFunc.prototype==a.prototype
,它将返回
true

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

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

你想做什么?你的horse和pig构造函数有一个相同的原型,所以“a”是horse的实例。确保使用“new Object()”而不是Object.prototype!!你想做什么?你的马和猪构造函数有一个相同的原型,所以这就是为什么“a”是马的实例。确保使用“new Object()”而不是Object.prototype!!
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!