1

假设我定义了 2 个构造函数和一个成员函数

function A() {}
function B() {}
A.prototype.a = function(){}

我已经实例化了一个B. 如何强制转换使其成为A?

o = new B();
//What should I put here?
o.a();

我是 js 新手。而且我有一种感觉,o上面提到的是 aA还是 aB仅由对 a 的引用控制prototype。因此,我觉得类型转换应该是可能的。

欢迎回答,以及可以帮助我理解 js 对象的解释。

4

1 回答 1

3

对象的原型一旦创建就不能更改(即完全换出)(但是;在 JavaScript 的未来版本中,这可能是可能的)。

不过,JavaScript 中的对象具有极大的可塑性。你可以这样做,例如:

o.a = A.prototype.a;

...然后o将具有该a功能。如果您想为其提供所有可枚举的属性A.prototype(包括原型中的任何属性):

var name;
for (name in A.prototype) {
    o[name] = A.prototype[name];
}

函数的prototype属性是一个完全正常的、无聊的对象,分配给函数的正常、无聊的属性。当您使用new该函数(称为“构造函数”)创建对象时,该函数的prototype属性被分配给新创建的对象作为其底层原型(没有您可以在代码中访问的名称[尚未]) .

从 ES5 开始(在 Chrome、Firefox、Opera 和 IE9 中得到合理支持;在 IE8 和更早版本中不支持),您可以通过获取对象的原型Object.getPrototypeOf,并且您可以创建对象并为其分配原型,而无需通过构造函数使用Object.create,但是一旦创建了对象,您就无法更改它的原型。

一些 JavaScript 引擎(如 Firefox 中的引擎)有一个当前非标准的扩展名__proto__,通过将其视为属性,您可以直接访问和操作对象的原型。例如:

o.__proto__ = A.prototype;

...但这不是目前的标准。不过,它很可能是下一个标准的一部分。如果您对即将推出的 ES6 的信息感兴趣,可以在此处找到规范草案等。

于 2012-12-02T09:18:39.253 回答