Javascript 如何将对象关键点添加到原型中?

Javascript 如何将对象关键点添加到原型中?,javascript,Javascript,如何将所有对象键/值添加到原型中 例如,如果我有对象 var serverResponse = { foo: 'bar' id: 123 name: 'Rick Sanchez' } 我想把每把钥匙都加到一个人的原型上。我可以像这样为每个键手动执行 function Person(serverResponse) { this.foo = serverResponse.foo; this.id = serverResponse.id; this.n

如何将所有对象键/值添加到原型中

例如,如果我有对象

var serverResponse = {
    foo: 'bar'
    id: 123
    name: 'Rick Sanchez'
}
我想把每把钥匙都加到一个人的原型上。我可以像这样为每个键手动执行

function Person(serverResponse) {
    this.foo = serverResponse.foo;
    this.id = serverResponse.id;
    this.name = serverResponse.name;
}

但我相信有更好的方法来做到这一点

我认为您不想将其添加到
Person
的原型中,因为这使它在
Person
的每个实例上都可用(而且似乎
serverResponse
包含特定于
Person
的某个实例(而不是所有实例)的变量-这很可能只是问题标题的术语问题)

也就是说,我一直都在这样做-我将一个通用JS对象(如您的
serverResponse
)传递给我的一个类(如
Person
)的构造函数,并将其保存为实例变量。然后我在原型上创建访问器方法,如下所示:

function Person(serverResponse) {
    this.serverResponse = serverResponse;
}

Person.prototype.getFoo = function() {
   return this.serverResponse.foo;
};

Person.prototype.getId = function() {
   return this.serverResponse.id;
};

...

我认为您不想将其添加到
Person
的原型中,因为这样就可以在
Person
的每个实例上使用它(而且似乎
serverResponse
包含特定于
Person
的某个实例(而不是所有实例)的变量-这很可能只是问题标题的术语问题)

也就是说,我一直都在这样做-我将一个通用JS对象(如您的
serverResponse
)传递给我的一个类(如
Person
)的构造函数,并将其保存为实例变量。然后我在原型上创建访问器方法,如下所示:

function Person(serverResponse) {
    this.serverResponse = serverResponse;
}

Person.prototype.getFoo = function() {
   return this.serverResponse.foo;
};

Person.prototype.getId = function() {
   return this.serverResponse.id;
};

...

听起来您不想添加到原型中,而是想复制所有属性。这可以在带有
Object.assign
的现代浏览器中完成(可以在古代浏览器中引入polyfill):

…当然,您必须相信
serverResponse
没有对象中不需要的数据。如果确实要分配给原型,您可以使用
object。在原型上分配

Object.assign(Person.prototype, serverResponse);

听起来您不想添加到原型中,而是想复制所有属性。这可以在带有
Object.assign
的现代浏览器中完成(可以在古代浏览器中引入polyfill):

…当然,您必须相信
serverResponse
没有对象中不需要的数据。如果确实要分配给原型,您可以使用
object。在原型上分配

Object.assign(Person.prototype, serverResponse);

您可能会这样认为,但不,我不认为有。只说
this.serverResponse=serverResponse
然后在您的代码后面引用类似
this.serverResponse.id的内容可能更容易。您可能会这样认为,但不,我认为没有。只说
this.serverResponse=serverResponse可能更容易然后在以后的代码中只引用类似于
this.serverResponse.id
的内容。当您在
serverResponse
上添加一个新属性时,它会变得异常脆弱,并且很难调试,而该属性恰好与Person原型上的一个方法同名。我意识到,虽然这正是我想要的,但在结束将响应分配给它自己的属性要好得多。在我的例子中,我将this.DTO设置为server response,然后我仍然可以添加我想要的任何属性,而不必担心名称冲突。当您在
serverResponse
上添加恰好相同的新属性时,这会变得异常脆弱,难以调试名称作为Person原型上的一种方法。我意识到,虽然这正是我所寻找的,但最终将响应分配给它自己的属性要好得多。在我的例子中,我将this.DTO设置为server response,然后我仍然可以添加任何我想要的属性,而不必担心名称冲突。