如何在 javascript 中检查没有原型链的实例
How can I check instanceof without the proto chain in javascript?
如何在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.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
相关文章:
- 为什么原型需要通过实例访问
- 为什么原型允许多个实例共享变量
- 为什么属性存在于对象实例上,即使其原型发生了更改
- 在 JavaScript 中,当我们实例化派生对象时,原型的函数隐藏在哪里
- 为什么函数对象的实例没有继承函数原型属性
- 如何在 javascript 中检查没有原型链的实例
- 我应该在原型上还是在新创建的实例上调用构造函数方法
- 使用Object.create作为原型的原型继承将[Object]作为实例的原型
- 不需要的Javascript效果:原型在实例之间共享闭包
- AngularJS:多个工厂实例任何原型继承
- 使用 JavaScript 中的实例更新原型
- 使用自定义原型实例化JavaScript函数
- 在定义了构造函数之后,是否可以将实例属性添加到JavaScript原型中
- 如何创建一个原型函数,将另一个原型函数绑定为语法糖(并保持实例的上下文)
- 从原型方法更改实例属性
- 复制 JavaScript 原型实例
- 如何在多个HTML页面中使用一个原型实例
- 添加到另一个原型实例的原型:JavaScript
- 像cat这样的原型实例c = new animal();
- Javascript静态方法与原型/实例化方法在性能上的对比