Javascript";新";关键字引用“引用”;“类”;性质

Javascript";新";关键字引用“引用”;“类”;性质,javascript,Javascript,我有一个javascript“类”,我实例化了好几次。 我的问题是,修改实例中的属性实际上会修改“类”的属性,因此进一步的实例不会以我希望的方式初始化。 下面是一个简化的代码片段,原始代码使用BackboneJS,但这足以说明我的情况: var foo=function(){ this.defaults.id=1; }; //这是我的财产 foo.prototype.defaults={ id:0, }; console.log(foo.prototype.defaults);//=>{id:

我有一个javascript“类”,我实例化了好几次。 我的问题是,修改实例中的属性实际上会修改“类”的属性,因此进一步的实例不会以我希望的方式初始化。 下面是一个简化的代码片段,原始代码使用BackboneJS,但这足以说明我的情况:

var foo=function(){
this.defaults.id=1;
};
//这是我的财产
foo.prototype.defaults={
id:0,
};
console.log(foo.prototype.defaults);//=>{id:0}
var bar=newfoo();

console.log(foo.prototype.defaults);//=>{id:1}
原型在该类型的所有对象之间共享。未制作新副本。初始化此实例唯一的属性的常用方法是直接在构造函数中初始化它们:

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
    };
};

不过,在实践中,通常更容易在默认值中编写如下代码:

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
    };
};

new
确实创建了一个新实例,但该实例指向原型,在所有实例之间共享。没有复制值,只分配指针。因此,如果
defaults
是共享的,那么修改它的属性也是共享的。谢谢你的解释。