javascript - 更改对象原型(prototype)以更改 instanceof 结果的好方法?

标签 javascript ecmascript-5 ecmascript-harmony

我想对 this old question 发表评论, 但它似乎被锁定了。

这是我的用例:

  1. 对象obj 是用构造函数Base 创建的。 obj instanceof Base 返回 true。
  2. 我想更改 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/

相关文章:

typescript - 错误 TS1056 : Accessors are only available when targeting ECMAScript 5 in gulp-typescript

javascript - 测试nodejs和谐生成器方法

javascript - 生成器的异常处理

javascript - 迭代DataTable()以获取每一行的td值

javascript - 为什么 var name = function(){...} 形式的函数在 ES5 中没有被提升?

javascript - 如何编写带有可传递参数的回调的 jQuery 函数?

javascript - 1 大概不等于 1

javascript - ES6 生成器函数中星号 (*) 的用途是什么

javascript - 如何创建圆环饼图的内边框?

javascript - react native : Draw on image with only JS code