我知道這是一個JavaScript本身的問題(或行爲),而不是Backbone的擴展方法,但我想知道什麼是避免它的最佳策略。骨幹:原型對象的惱人行爲
讓我們更好地把它放在代碼:
var MyModel = Backbone.Model.extend({
value: 0,
values: []
});
var myFirstModel = new MyModel();
myFirstModel.value // 0, as expected
myFirstModel.values // [], as expected
var mySecondModel = new MyModel();
mySecondModel.value = 2;
mySecondModel.values.push(2)
mySecondModel.value // 2, as expected
mySecondModel.values // [2], as expected
myFirstModel.value // 0, as expected
myFirstModel.values // [2], ... WAT!!!
我明白,這個問題是我不是,我只是在數值變量,在操作mySecondModel.values分配一個新的值原型,也就是MyModel.prototype.values(當然與其他任何對象都有同樣的問題)
但是這很容易搞砸了。最直觀的是把它們當作INSTANCE變量,而不是每個實例通用的變量(基於類的語言中的靜態變量或類變量)。
到目前爲止,但是現在我發現一般的解決方法是將每個變量初始化initialize方法,如:
var MyModel = Backbone.Model.extend({
initialize: function() {
this.value = 0;
this.values = [];
}
});
這樣,一切正常,即使它不會是neccesary對於一個簡單的值(比如this.value),我發現在任何情況下堅持這個原則都容易得多。
我不知道是否有一些更好的(更優雅,更清晰)解決了這個問題
很好的回答!事實上,我簡化了這個例子,我沒有使用Backbone Model,但是使用我自己的Controller模型,我只是在Backbone的擴展中混合使用Controller.extend = Backbone.Model.extend;然後我發現我討論的這件令人討厭的事情。這就是爲什麼我沒有使用模型的屬性。順便說一句,我已經理解了原型的東西,但你解釋得很清楚。用於解釋「遮蔽原型」技術以及區分模型屬性和模型屬性的額外榮譽。 – opensas 2013-02-19 07:11:02