[英]Backbone.js instance vs class variables
我對實例和類變量有些困惑。 我擺弄一個小東西來顯示似乎與我不一致的東西。
https://jsfiddle.net/njcfm4n8/1/
我熟悉將數組聲明為子類屬性的問題,應該在initialize
函數中完成它,否則該數組將在所有實例之間共享。 小提琴證明了這一點。 但是,為什么number
屬性也不能共享?
根據muistooshort和maris的評論,數組恰好像類屬性一樣工作,因為它是引用類型。 該數組實際上是在模型實例之間共享的,但這更多是JavaScript的怪癖,而不是用Backbone創建類變量的預期方式。
另一方面,整數是原始類型,以及布爾值和字符串,而javascript不會傳遞對這些類型的引用,而是將其復制。
數組,對象和函數是引用類型,而整數,布爾值,null和undefined是值類型。 您可以在此處了解更多信息: http : //docstore.mik.ua/orelly/webprog/jscript/ch04_04.htm
如果要使用類屬性,那么Backbone文檔的這一部分是相關的: http : //backbonejs.org/#Model-extend
extendBackbone.Model.extend(properties,[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
對象的__proto__
都具有n
和arr
並可以訪問它們。
數組在對象之間共享,因為沒有分配放置數組的位置。 推變異數組本身。
但是增加實際上創建新值,然后將其分配給對象。
從規范: test1.n++
實際上將執行此操作
test1
獲取屬性n
(如果不在其中,則在test1.__proto__
...中進行搜索)並將其保存為虛擬變量old_val
。 new_val
設置為old_val + 1
n
值設置為new_val
值 old_val
通過規范步驟3,不檢查屬性n
初始位置。 它將向test1
添加新屬性。
規范
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.