我在网上搜索关于原型继承的所有示例和问题都显示了原型分配给构造函数并且在它被调用之前,就像下面的代码一样:
Object.beget = function (o) {
var F = function () {};
F.prototype = o;
return new F();
};
我的问题是,有没有办法在以下方式更改对象(不是构造函数)原型,以便我可以访问没有直接调用它的新原型方法,或者换句话说,对象继承其新原型方法的方式?
编辑:
我想这个问题的焦点可能并不清楚,我对增强对象的原型不感兴趣,我真正想要的是一种分配新原型的方法,而不改变其他具有相同原型的对象原型作为第一个。
答案 0 :(得分: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?。
答案 1 :(得分:0)
您可以为原始对象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
答案 2 :(得分:0)
如果与对象关联的原型在创建对象后发生了变化(这意味着应该删除所有来自先前原型链的属性并添加新属性),那么它不等于创建一个实例这个新原型的新对象?在这种情况下,为什么不创建一个新对象并使用它呢?
如果我遗漏了任何用例,请告诉我。