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

Javascript 更改通过文字初始化创建的对象的原型,javascript,Javascript,假设我只想使用(而不是构造函数)。我有一个这样的物体: var o = { name : "Jack" } function U () {} U.prototype.name = "Jack"; var u = new U; console.log( u.name );//prints Jack 如果我想创建另一个对象,其原型是o,我使用以下语法: var u = Object.create( o ); console.log( u.name );//prints Jack u.name

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

var o = {
  name : "Jack"
}
function U () {}
U.prototype.name = "Jack";
var u = new U;
console.log( u.name );//prints Jack
如果我想创建另一个对象,其原型是
o
,我使用以下语法:

var u = Object.create( o );
console.log( u.name );//prints Jack
u.name = "Jill";
console.log( u.name );//prints Jill
很好!没问题。但是现在在运行时,我想把
u
的原型改成其他东西。如果
u
是使用如下构造函数创建的:

var o = {
  name : "Jack"
}
function U () {}
U.prototype.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
原型中的任何内容都会自动添加到这些更改后创建的每个对象中。但是,如何对对象文字获得相同的效果呢

请提供具有简洁语法的最简单解决方案。我只是想知道是否可以手动操作。我也不想使用非标准关键字

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


因为我想在创建后以标准方式更改原型(如果可能的话)。类似于
Object.setPrototype()
的东西将是完美的,但该函数不存在!有没有其他方法可以简单地设置使用对象文字初始化创建的对象的原型?

在当前规范中,一旦对象被实例化,就不能更改其原型(例如,换出一个,换入另一个)。(但请参见下文,情况可能会发生变化。)您只能修改对象的原型。但这可能就是你想要的,看看你的问题

要明确区别:

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是用这样的构造函数创建的……那么我添加到
u
原型中的任何内容都会自动添加到这些更改后创建的每个对象中。但是,如何对对象文字获得相同的效果呢

通过修改传递给
对象的对象。如上所述,创建
作为原型。请注意,将
bar1
添加到
p1
使其在
o
上可用,即使
o
是在添加之前创建的。与构造函数一样,原型关系持续存在,
o
不会获得
p1
的快照。从创建时起,它会获得一个持久的链接


ES.next看起来很可能有“”(