2016-06-09 95 views
0

我對實例和類變量有一些困惑。我做了一個小提琴來展示一些看起來不一致的東西。Backbone.js實例與類變量

https://jsfiddle.net/njcfm4n8/1/

我熟悉聲明數組作爲一個子類屬性的問題,應該在initialize函數來完成,否則陣列的所有實例之間共享。小提琴演示了這一點。但是,爲什麼number屬性不能共享?

回答

2

根據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 
+1

我認爲你被錯誤的 「類變量」 術語分心。真正的問題是,在原型的數組上調用'push'會在原地修改數組,但在原型中的數字上使用'++'會跳出原型(即將新值複製到實例而不更改在原型中的價值)。 –

+0

@ muistooshort你說得對,謝謝。雖然數組看起來像一個類變量一樣工作,但這是因爲它是一個對象,JavaScript使用對象的引用而不是複製它們。所以它真的是跨班級共享,但不是故意的。我會編輯我的答案來反映這一點。 –

+2

更準確地說,boolean,int是值類型,object和array是引用類型。 – Maris

1

骨幹你的屬性(narr)添加到myModel原型。

因爲所有myModel對象的narr在他們的__proto__並且可以訪問它們。

在對象之間共享的數組,因爲沒有指定放置數組的地方。推變陣本身。

但實際增量創建新值,然後將其分配給對象。

從規格: test1.n++實際上將做到這一點

  1. 得到對象test1財產n(如果它不存在於test1.__proto__ ...搜索),並將其保存虛擬變量old_val
  2. 設置虛擬變量new_valold_val + 1
  3. 的對象「測試1」屬性n設定值的new_val
  4. 返回old_val

值通過規範步驟3中未檢查的屬性n初始位置。它將增加新的財產到test1

規範