我对实例和类变量有些困惑。我做了一个小提琴来展示一些与我不一致的东西。
https://jsfiddle.net/njcfm4n8/1/
我熟悉将数组声明为子类属性的问题,应该在initialize
函数中完成,否则数组在所有实例之间共享。小提琴证明了这一点。但是,为什么number
属性也不共享?
答案 0 :(得分:2)
根据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
答案 1 :(得分:1)
Backbone将您的属性(n
和arr
)添加到myModel
原型。
因为所有myModel
个对象在n
中都有arr
和__proto__
,并且可以访问它们。
在对象之间共享数组,因为没有赋值存放数组。推送变异数组本身。
但增量实际创建新值然后将其分配给对象。
来自规范:
test1.n++
实际上会这样做
n
获取属性test1
(如果它不在test1.__proto__
中搜索...)并保存虚拟变量old_val
。new_val
设置为old_val + 1
n
的值价值为new_val
old_val
通过规范步骤3不检查属性n
的初始位置。它会向test1
添加新属性。
规范