【问题标题】:Assigning an object prototype after creation创建后分配对象原型
【发布时间】:2015-04-04 18:20:08
【问题描述】:

我在网上搜索到的关于原型继承的所有示例和问题都显示了原型在构造函数被调用之前的分配,很像下面的代码:

Object.beget = function (o) {
    var F = function () {};
    F.prototype = o;
    return new F();
};

我的问题是,有没有办法改变一个 object不是构造函数)原型,在它被实例化之后,我可以访问新的原型方法而不直接调用它,或者换句话说,对象继承它的新的原型方法

编辑:

我想问题的重点可能不清楚,我对增强对象的原型不感兴趣,我真正想要的是一种分配新原型的方法,而无需更改与第一个具有相同原型的其他对象.

【问题讨论】:

标签: javascript inheritance prototype prototype-programming


【解决方案1】:

有没有办法在对象实例化后更改其原型?

是的,有:Object.setPrototypeOf(仅限 ES6),Object.getPrototypeOf 的对应物——它访问对象的真实原型,而不仅仅是 .prototype 属性。还有.__proto__ getter/setter property(已弃用)也有相同的功能(请参阅Quick Javascript inheritance: Understanding __proto__)。

但是,请注意,这样做通常是一个糟糕的主意。不仅因为可能有 engines that don't support these,而且它击败了引擎对实例使用的所有花哨优化:Why is mutating the [[prototype]] of an object bad for performance?

【讨论】:

  • 这正是我所需要的,非常感谢您的回答和参考@Bergi
【解决方案2】:

您可以为原始对象 o 分配新属性,新对象实例将自动访问这些属性:

Object.beget = function (o) {
    var F = function () {};
    F.prototype = o;
    return new F();
};

var o = {
    a: 1
};

var instance = Object.beget(o);

instance.a === o.a; // true

o.b = function () {};

instance.b === o.b; // true

【讨论】:

  • 其实我的疑惑是反过来的,我不想增强以前的原型,我想完全改变一个 object 原型而不改变其他对象的原型具有相同的原型。
【解决方案3】:

如果创建对象后与对象关联的原型发生了变化(这意味着所有来自之前原型链的属性都应该被删除并添加新属性),这不等于创建一个新对象的实例吗?有了这个新原型?在这种情况下,为什么不创建一个新对象并使用它呢?

如果我遗漏任何用例,请告诉我。

【讨论】:

  • 正如我在另一篇评论中提到的,创建一个新对象的解决方案是可行的,但它与“劫持”对象的原型不同,因为先前对象属性的所有值都必须是除了创建新实例的开销之外,还转移到新实例。
猜你喜欢
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
相关资源
最近更新 更多