在 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.prototype
与Bar.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
如何在 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.prototype
与Bar.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