2014-04-24 81 views
2

此功能的示例:JavaScript构造压倒一切

function User (name) { 
    this.options.name = name; 
}; 

User.prototype.options = { 
    name: 'Default' 
}; 

var foo = new User('foo'); 
var bar = new User('bar'); 

console.log(foo.options.name); // 'bar' 
console.log(bar.options.name); // 'bar' 

的问题是,如何让“富”和“酒吧”? 谢谢

+0

我明白了。谢谢! – Defari

+0

变异和分配成员是有区别的。当您在原型上分配共享成员时,它将被隐藏,当您进行变更时,您将更改所有实例的共享成员。它在这里详细解释:http://stackoverflow.com/a/16063478/1641941 – HMR

回答

3

当你在构造函数的原型中添加任何东西时,它将被所有实例共享。这对于功能来说是最好的事情,但可能不是数据。所以,要构建options对象的构造函数本身,这样

function User(name) { 
    this.options = { 
     name: name || "Default" 
    }; 
} 

当你做这样的,只要创建的User一个对象,每个对象将获得自己的options对象。因此,使用一个对象更改options不会影响任何其他对象的options

+0

你不能说它不是最好的data.it取决于你想要什么,在原型中定义属性也是有用的实例。例如你可以添加一个实例计数器。 –

+0

@ ThorstenArtner'Austria'稍微改变了这句话。请检查:) – thefourtheye

+0

原始值通常在原型上,因此它们将具有不能通过实例更改的默认值,因为重新分配(只能改变基元的方式,因为它们是不可变的)将导致成员被映射。 – HMR