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

How can I check instanceof without the proto chain in javascript?

如何在 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

基本上,我希望最后两行 return 错误。我该怎么做?

当您进行 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

这就是为什么您在问题 return true.

中所做的所有 instanceof 检查

要解决此问题,您需要根据 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