创建后指定对象原型

Assigning an object prototype after creation

本文关键字:对象 原型 创建      更新时间:2023-09-26

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

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

我的问题是,有没有一种方法可以在对象不是构造函数)原型安装后更改它,这样我就可以访问新的原型方法,而无需直接调用它,或者换句话说,这样对象继承其新原型方法

编辑:

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

有没有一种方法可以在对象的原型安装完成后更改它?

是的,有:Object.setPrototypeOf(仅限ES6),它是Object.getPrototypeOf的对应对象,它访问对象的真实原型,而不仅仅是.prototype属性。还有.__proto__ getter/setter属性(不推荐使用)也有同样的作用(请参阅Quick Javascript继承:理解__proto__)。

然而,请注意,这样做通常是个糟糕的主意。这不仅是因为可能有一些引擎不支持这些,而且它击败了引擎对实例的所有花哨的优化:为什么改变对象的[[原型]]对性能不利?。

您可以将新属性分配给原始对象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

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

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