我對實例和類變量有一些困惑。我做了一個小提琴來展示一些看起來不一致的東西。Backbone.js實例與類變量
https://jsfiddle.net/njcfm4n8/1/
我熟悉聲明數組作爲一個子類屬性的問題,應該在initialize
函數來完成,否則陣列的所有實例之間共享。小提琴演示了這一點。但是,爲什麼number
屬性不能共享?
我對實例和類變量有一些困惑。我做了一個小提琴來展示一些看起來不一致的東西。Backbone.js實例與類變量
https://jsfiddle.net/njcfm4n8/1/
我熟悉聲明數組作爲一個子類屬性的問題,應該在initialize
函數來完成,否則陣列的所有實例之間共享。小提琴演示了這一點。但是,爲什麼number
屬性不能共享?
根據muistooshort和maris的評論,該數組碰巧像類屬性一樣工作,因爲它是一個引用類型。該數組真的在模型的實例中共享,但這更像是javascript的怪癖,而不是用Backbone創建類變量的預期方式。
另一方面,整數是一個原始類型,以及布爾值和字符串,並且javascript不會將這些類型的引用傳遞給它們,而是將它們複製。
數組,對象和函數是引用類型,而整數,布爾值,空值和未定義值類型。您可以瞭解更多有關在這裏:http://docstore.mik.ua/orelly/webprog/jscript/ch04_04.htm
如果你想利用類的屬性,那麼這個骨幹文檔的部分是相關的:http://backbonejs.org/#Model-extend
extendBackbone.Model.extend(屬性,[classProperties ])
要創建您自己的Model類,您需要擴展Backbone.Model並提供實例屬性以及可選的classProperties,以直接附加到構造函數中。
我分叉這裏https://jsfiddle.net/zn6bu4uf/3/你的jsfiddle與此代碼:
var myModel = Backbone.Model.extend({}, {foo: 0})
console.log(myModel.foo); // 0
myModel.foo++;
console.log(myModel.foo); // 1
var test1 = new myModel();
var test2 = new myModel();
test1.constructor.foo++;
test1.constructor.foo++;
test2.constructor.foo++;
console.log(test1.constructor.foo) // 4
console.log(test2.constructor.foo) // 4
骨幹你的屬性(n
和arr
)添加到myModel
原型。
因爲所有myModel
對象的n
和arr
在他們的__proto__
並且可以訪問它們。
在對象之間共享的數組,因爲沒有指定放置數組的地方。推變陣本身。
但實際增量創建新值,然後將其分配給對象。
從規格: test1.n++
實際上將做到這一點
test1
財產n
(如果它不存在於test1.__proto__
...搜索),並將其保存虛擬變量old_val
。new_val
到old_val + 1
n
設定值的new_val
old_val
值通過規範步驟3中未檢查的屬性n
初始位置。它將增加新的財產到test1
。
規範
我認爲你被錯誤的 「類變量」 術語分心。真正的問題是,在原型的數組上調用'push'會在原地修改數組,但在原型中的數字上使用'++'會跳出原型(即將新值複製到實例而不更改在原型中的價值)。 –
@ muistooshort你說得對,謝謝。雖然數組看起來像一個類變量一樣工作,但這是因爲它是一個對象,JavaScript使用對象的引用而不是複製它們。所以它真的是跨班級共享,但不是故意的。我會編輯我的答案來反映這一點。 –
更準確地說,boolean,int是值類型,object和array是引用類型。 – Maris