创建后指定对象原型
Assigning an object prototype after creation
我在网上搜索到的所有关于原型继承的例子和问题都显示了在调用之前将原型分配给构造函数,很像下面的代码:
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
如果在创建对象后,与对象关联的原型发生了变化(这意味着应该删除以前原型链中的所有属性,并添加新的属性),这不等于用这个新原型创建一个新对象的实例吗?在这种情况下,为什么不创建一个新对象并使用它呢?
如果我遗漏了任何用例,请告诉我。
相关文章:
- 重载JS'firefox中的对象原型
- 带有对象/原型的链式承诺(Q延期)
- 别名或以其他方式合并两个具有不同名称的相同对象原型
- 创建后指定对象原型
- javascript对象原型与jquery冲突
- 为什么我要将函数添加到对象原型中,而不是将其添加到对象中
- 基本对象/原型语法问题
- Javascript对象/原型.我的理解错了吗
- ES6 const,用于在JavaScript中创建对象原型;这是一种模式吗
- 在角度表达式中使用对象原型
- 对象原型和继承
- 为什么javascript对象原型被称为“fn”
- Uncaught TypeError:对象原型在Symfony 2中只能是Object或ExtJS为null
- 在Javascript中将对象原型函数绑定到对象
- 对象原型在Canvas Game中不起作用
- 如何获取Javascript对象原型的属性
- 为对象原型提供一个方法,该方法指向对象自身属性的值
- 向对象原型添加命名空间方法
- 在Vanilla Javascript中使用窗体中的对象原型创建多个用户
- Javascript对象原型错误