2014-04-24 123 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