更改通过文字初始化创建的对象的原型

2024-04-03

假设我只想使用(不是构造函数)。我有一个这样的对象:

var o = {
  name : "Jack"
}

如果我想创建另一个对象,其原型是o我使用这个语法:

var u = Object.create( o );
console.log( u.name );//prints Jack
u.name = "Jill";
console.log( u.name );//prints Jill

工作正常!没问题。但现在在运行时我想改变原型u到别的东西。如果u是用这样的构造函数创建的:

function U () {}
U.prototype.name = "Jack";
var u = new U;
console.log( u.name );//prints Jack

OR

function U () {
  this.name = "Jack";
}
var u = new U;
console.log( u.name );//prints Jack

但是当使用构造函数时,我可以完全改变原型:

function U () {}
//totally changed the prototype object to another object
U.prototype = {
  dad : "Adam"
}
var u = new U;
console.log( u.dad );//prints Adam

然后无论我添加到原型中U将自动添加到这些更改后创建的每个对象中。但是如何使用对象字面量获得相同的效果呢?

请提供最简单的解决方案,该解决方案具有简洁的语法。我只是想知道是否可以手动完成此操作。我不想使用非标准的__proto__ https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/proto关键字也可以。

我搜索过 Stackoverflow,这并不是以下问题的重复:

  • 将原型添加到 JavaScript 对象文字 https://stackoverflow.com/questions/1592384/adding-prototype-to-object-literal
  • 将原型添加到对象字面量 https://stackoverflow.com/questions/3452414/adding-a-prototype-to-an-object-literal

因为我想在创建后以标准方式更改原型(如果可能的话)。就像是Object.setPrototype()就完美了,但是这个功能不存在!是否有其他方法可以简单地设置使用对象文字初始化创建的对象的原型?


根据当前的规范,您无法change对象实例化后的原型(例如,换出一个并换入另一个)。(但请参阅下文,情况可能会发生变化。)你只能modify对象的原型。但这可能就是您想要的,看看您的问题。

要明确区别:

var p1 = {
    foo1: function() {
        console.log("foo1");
    }
};
var p2 = {
    foo2: function() {
        console.log("foo1");
    }
};

var o = Object.create(p1);
o.foo1(); // logs "foo1"
o.foo2(); // ReferenceError, there is no foo2
// You cannot now *change* o's prototype to p2.
// You can modify p1:
p1.bar1 = function() { console.log("bar1"); };
// ...and those modifications show up on any objects using p1
// as their prototype:
o.bar1(); // logs "bar1"
// ...but you can't swap p1 out entirely and replace it with p2.

回到你的问题:

如果你是用这样的构造函数创建的...那么我添加到原型中的任何内容U将自动添加到这些更改后创建的每个对象中。但是如何使用对象字面量获得相同的效果呢?

通过修改您传入的对象Object.create作为原型,如上所述。注意如何添加bar1 to p1使其可用于o, 虽然o是在添加之前创建的。就像构造函数一样,原型关系持续存在,o没有得到快照p1从创建之日起,它就获得了持久的链接。


ES.next 看起来可能有“设置原型运算符 http://wiki.ecmascript.org/doku.php?id=harmony%3aproto_operator" (<|),这将使做到这一点成为可能。但没有standard目前的机制。一些引擎实现了一个伪属性,称为__proto__它现在提供了此功能,但尚未标准化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更改通过文字初始化创建的对象的原型 的相关文章

随机推荐