我有一个javascript" class",我多次实例化。 我的问题是从实例修改属性确实会修改"类"的那些属性,因此不会按照我喜欢的方式初始化更多实例。 这是一个简化的代码片段,原始代码使用的是BackboneJS,但这足以说明我的情况:
var foo = function() {
this.defaults.id = 1;
};
// This is my property
foo.prototype.defaults = {
id: 0,
};
console.log( foo.prototype.defaults ); // => {id: 0}
var bar = new foo();
console.log( foo.prototype.defaults ); // => {id: 1}

我认为"新"关键字会成为一个全新的对象,但它似乎只是引用了原型属性。 我带来的最佳选择是从构造函数中克隆所有属性......
有没有人有一个干净的方法来实现一个干净的#Class; Class Property"行为?
非常感谢,
罗曼。
编辑:它不能从SO片段中运行...如果需要,只需将其复制/粘贴到您的控制台。
答案 0 :(得分:2)
prototype
在此类型的所有对象之间共享。没有制作新的副本。初始化对此实例唯一的属性的常用方法是直接在构造函数中初始化它们:
this.property = "foo";
这将覆盖原型中同名的任何属性,并且每个实例都是唯一的。
通常,原型不用于数据属性,因为它们在所有实例之间共享。如果要使用默认的数据属性集初始化对象,那么“最佳实践”是将一组默认属性分配给对象实例,然后设置任何覆盖。您不能只指定一个默认对象,因为对象是由指针指定的,而不是通过复制指定的,因此所有对象仍然指向同一个对象(使用原型时遇到的问题相同)。
您可以使用一组默认值初始化对象:
var foo = function() {
this.defaults = {};
// copy default properties
for (var prop in foo.defaults) {
this.defaults[prop] = foo.defaults[prop];
}
this.defaults.id = 1;
};
// defaults (not on the prototype)
foo.defaults = {
id: 0,
something: "whatever",
line: 22
};
虽然在实践中,通常更容易编码默认值,如下所示:
var foo = function() {
this.options = {
id: 1,
something: "whatever",
line: 22
};
};