javascript继承和instanceof运算符差异

时间:2015-05-21 08:57:11

标签: javascript instanceof prototypal-inheritance

考虑构造函数:

function ConstructorOne(){/*.....*/}
function ConstructorTwo(){/*.....*/}

考虑以下js代码:

var myInstance = new ConstructorOne();
ConstructorOne.prototype=new ConstructorTwo();
myInstance instanceof ConstructorOne; // false - why?
myInstance instanceof ConstructorTwo; // false - why?

如果我在将构造函数分配给构造函数之后进行实例化,那么一切正常:

ConstructorOne.prototype = new ConstructorTwo();
var myInstance = new ConstructorOne();
myInstance instanceof ConstructorOne; // true
myInstance instanceof ConstructorTwo; // true

第一个例子中出现这种异常行为的原因是什么?

这是the fiddle

1 个答案:

答案 0 :(得分:3)

因为在第一个示例中,您将新的原型对象分配给实例的构造函数。引用docs

  

对象instanceof构造函数

     

instanceof运算符测试对象原型链中constructor.prototype的存在。

在此示例中:

var myInstance = new ConstructorOne();
ConstructorOne.prototype = new ConstructorTwo();

... myInstance原型链(以__proto__对象开头)包含ConstructorOne的(“默认”)原型。在使用代码的第二行完全重写后,ConstructorOne.prototype不再是myInstance原型链中的那个对象 - 因此false导致instanceof }。