javascript-更改对象原型以更改instanceof结果的好方法?
作者:互联网
我想评论this old question,但似乎已被锁定.
这是我的用例:
>使用构造函数Base创建对象obj. obj instanceof Base返回true.
>我想更改obj的原型,使其看起来好像obj是从Derived构造的.那就是我想要
> obj可以访问Derived的方法
> obj instanceof派生返回true
原因是obj将在层次结构中具有一个类型,该类型在创建时是未知的,并由其后的状态决定.我希望能够将其向下移动到层次结构中.
我相信我可以做到
obj .__ proto__ =派生原型
但是__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成为新的基础:
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处进行更改:-)
标签:ecmascript-5,ecmascript-harmony,javascript 来源: https://codeday.me/bug/20191101/1984238.html