我想对 this old question 发表评论, 但它似乎被锁定了。
这是我的用例:
- 对象
obj
是用构造函数Base
创建的。obj instanceof Base
返回 true。 - 我想更改
obj
的原型(prototype),使其看起来好像obj
是从Derived
构建的。也就是说,我想要obj
以访问Derived
的方法
obj instanceof Derived
返回 true
原因是 obj
在层次结构中有一个类型,它在创建时是未知的,由之后发生的事情决定。我希望能够将其向下移动。
我相信我可以用
obj.__proto__ = Derived.prototype;
但是 __proto__
将在下一版本的 JavaScript 中被弃用。 proxies API,自从我上面链接的问题被问到以来已经改变,似乎不支持我的用例。
我的用例是否有现在存在或计划在未来使用的替代实现?
我现在能看到的唯一选择是使用
obj2 = Object.create(Derived.prototype);
obj2.extend(obj);
并且永远不要存储多个对 obj 的引用,但这样的开销会带来很大的不便。
这是一个fiddle演示问题。
最佳答案
我认为不可能这样做。正如 RobG 所展示的,您可以通过更改损害类的 prototype
属性来使 instanceof 返回 false
。
看到这一点,我认为你可以用一个额外的类来做到这一点,你知道的,比如来自普通 Object.create
shim 的 F
:
Object.newChangeable = function create(b) {
function F(){b.call(this);}
F.prototype = b.prototype;
var f = new F();
f.change = function change(n) {
F.prototype = n.prototype;
};
return f;
}
var obj = Object.newChangeable(Base);
obj instanceof Base; // true
obj.change(Derived);
但是没有:
obj instanceof Derived; // still false
obj instanceof Base; // still true
因为 obj
的内部 [[Prototype]] 仍然指向与 Base.prototype
相同的地方。您可以做的是使 Derived
成为新的 Base
:
var obj = new Base;
obj instanceof Base; // true
Derived.prototype = Base.prototype;
Base.prototype = {}; // something else
alert(obj instanceof Derived); // true
alert(obj instanceof Base); // false
但我认为这不是您想要的,操作表达式的右侧而不是更改 obj
中的某些内容:-)
关于javascript - 更改对象原型(prototype)以更改 instanceof 结果的好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9898875/