[英]Javascript “new” keyword making references to “class” properties
我有一个javascript“类”,我实例化了几次。 我的问题是,从实例修改属性实际上会修改“类”的那些属性,因此其他实例不会按照我想要的方式进行初始化。 这是发生的事情的简化片段,原始代码使用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}
我以为“ new”关键字将成为一个全新的对象,但似乎它只是对原型属性的引用。 我最好的选择是从构造函数内部克隆所有属性。
有没有人有一种干净的方法来实现干净的“类属性”行为?
提前谢谢了,
罗曼
编辑:从SO片段中无法使用...如果需要,只需将其复制/粘贴到控制台即可。
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
};
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.