instanceof运算符只检查构造函数的公共属性prototype
是否在对象的[[Prototype]]
链上。打破链条的一种方法是更改构造函数的原型:
function Base() {}
var base = new Base();
alert( base instanceof Base); // true
Base.prototype = {};
alert( base instanceof Base); // false
alert( base instanceof Object); // true
第二个警报是错误的,因为新Base.prototype
的不在[[Prototype]]
链上base
(但原来的仍然存在)。请注意,Object.protoyype
仍然是。以上是instanceof
运算符不被视为特别有用的原因之一。
要执行您想要执行的操作,您必须在[[Prototype]]
构造对象时创建链,因为您以后无法更改它:
Derived.prototype = new Base();
var base = new Derived();
alert(base instanceof Base); // true
alert(base instanceof Derived); // true
编辑
要求是:
- 对象 obj 是使用构造函数 Base 创建的。obj instanceof Base 返回 true。
如图所示,这不一定是真的。如果您有一个依赖于instanceof
返回特定值的策略,那么您对设计施加了(可能是不合理的)约束,没有明显的好处。
2
. 我想更改 obj 的原型,使其看起来好像 obj 是从 Derived 构造的。也就是说,我要
•obj 以访问 Derived 的方法
您可以通过使 Base.prototype 成为 Derived 的实例(如图所示)或将属性复制到 Base.prototype 来做到这一点。
•obj instanceof 派生返回true
您可以通过在创建任何Base实例之前创建DerivedBase.prototype
实例来做到这一点。
创建实例后,您无法修改链。如果您放弃instanceof
约束,那么您可以Derived.prototype
通过简单地将方法复制到Base.prototype
. 另一种方法是使用call或apply:
Derived.prototype.someMethod.call(base, ...);
但我怀疑你正在尝试做一些不可能的事情。