如何在没有javascript原型链的情况下检查instanceof?

时间:2015-03-07 06:56:00

标签: javascript prototype prototypal-inheritance

如何在javascript中检查没有原型链的instanceof?

var EventEmitter = require('events').EventEmitter;

var Foo = function(){

};
Foo.prototype = EventEmitter.prototype;

var Bar = function(){

};
Bar.prototype = EventEmitter.prototype;

var f = new Foo();
var b = new Bar();

f instanceof Foo; //returns true
b instanceof Bar; //returns true

f instanceof Bar; //returns true
b instanceof Foo; //returns true

基本上,我希望最后两行返回false。我该怎么做?

1 个答案:

答案 0 :(得分:2)

进行instanceof检查时,

f instanceof Foo

它将采用内部[[prototype]]对象(可以使用Object.getPrototypeOf访问)并查找它是否出现在Foo原型链中的任何位置,直到找到Object沿线。

此处需要注意的另一个要点是,Foo.prototypeBar.prototype相同。因为您为这两个属性分配了相同的对象。您可以像这样确认

console.log(Foo.prototype === Bar.prototype);
// true
console.log(Object.getPrototypeOf(f) === Object.getPrototypeOf(b));
// true

这就是为什么您在问题中所做的所有instanceof次检查都会返回true

要解决此问题,您需要根据EventEmitter的原型(不使用它)创建原型对象。您可以使用Object.create为您执行此操作。它需要一个对象,它应该用作新构造对象的原型。

Foo.prototype = Object.create(EventEmitter.prototype);
...
Bar.prototype = Object.create(EventEmitter.prototype);

有了这个改变,

console.log(Foo.prototype === Bar.prototype);
// false
console.log(Object.getPrototypeOf(f) === Object.getPrototypeOf(b));
// false
console.log(f instanceof Foo);
// true
console.log(b instanceof Bar);
// true
console.log(f instanceof Bar);
// false
console.log(b instanceof Foo);
// false