如何在 javascript 中检查没有原型链的实例

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

本文关键字:原型 实例 检查 javascript      更新时间:2023-09-26

如何在javascript中检查没有proto链的实例?

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。我该怎么做?

当你做一个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