编程语言
首页 > 编程语言> > javascript-更改对象原型以更改instanceof结果的好方法?

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