Backbone.js实例与类变量



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

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

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

根据muistoosort和maris的评论,数组恰好像类属性一样工作,因为它是一个引用类型。该数组确实在模型的实例之间共享,但这更多的是javascript的一个怪癖,而不是使用Backbone创建类变量的预期方式。

另一方面,整数是一种基元类型,还有布尔值和字符串,javascript不传递对这些类型的引用,而是复制它们。

数组、对象和函数是引用类型,而整数、布尔值、null和undefined是值类型。您可以在此处了解更多信息:http://docstore.mik.ua/orelly/webprog/jscript/ch04_04.htm

如果你想利用类属性,那么主干文档的这一部分是相关的:http://backbonejs.org/#Model-扩展

extendBackbone.Model.extend(properties,[classProperties])

要创建自己的Model类,可以扩展Backbone.Model并提供实例属性,以及直接附加到构造函数的可选classProperties。

我把你的jsfiddle叉在这里了https://jsfiddle.net/zn6bu4uf/3/使用此代码:

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

Backbone将您的属性(narr)添加到myModel原型中。

因此,所有myModel对象的__proto__中都有narr,并且可以访问它们。

数组在对象之间共享,因为没有指定数组存储的位置。Push使数组本身发生突变。

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

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

  1. 从对象test1获取属性n(如果它在test1.__proto__中不存在搜索…),并将其保存为虚拟变量old_val
  2. 将虚拟变量new_val设置为old_val + 1
  3. 将对象"test1"中属性n的值设置为new_val的值
  4. 返回old_val

根据规范步骤3,不检查属性n的初始位置。它将向test1添加新属性。

规格

  • 增量后评估
  • 获取并设置对象的值

最新更新