如何在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。我该怎么做?
答案 0 :(得分:2)
进行instanceof
检查时,
f instanceof Foo
它将采用内部[[prototype]]
对象(可以使用Object.getPrototypeOf
访问)并查找它是否出现在Foo
原型链中的任何位置,直到找到Object
沿线。
此处需要注意的另一个要点是,Foo.prototype
与Bar.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