Backbone.js实例与类变量

时间:2016-06-09 16:59:51

标签: javascript backbone.js

我对实例和类变量有些困惑。我做了一个小提琴来展示一些与我不一致的东西。

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

我熟悉将数组声明为子类属性的问题,应该在initialize函数中完成,否则数组在所有实例之间共享。小提琴证明了这一点。但是,为什么number属性也不共享?

2 个答案:

答案 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将您的属性(narr)添加到myModel原型。

因为所有myModel个对象在n中都有arr__proto__,并且可以访问它们。

在对象之间共享数组,因为没有赋值存放数组。推送变异数组本身。

但增量实际创建新值然后将其分配给对象。

来自规范:  test1.n++实际上会这样做

  1. 从对象n获取属性test1(如果它不在test1.__proto__中搜索...)并保存虚拟变量old_val
  2. 将虚拟变量new_val设置为old_val + 1
  3. 在对象" test1"中设置属性n的值价值为new_val
  4. return old_val
  5. 通过规范步骤3不检查属性n的初始位置。它会向test1添加新属性。

    规范