Backbone.js 个实例与 class 个变量

Backbone.js instance vs class variables

我对实例和 class 变量有些困惑。我做了一个 fiddle 来显示一些对我来说似乎不一致的东西。

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

我很熟悉将数组声明为子数组的问题class 属性,它应该在initialize函数中完成,否则数组将被共享实例。 fiddle 证明了这一点。但是,为什么 number 属性 也没有共享?

根据 muistooshort 和 maris 的评论,数组恰好像 class 属性 一样工作,因为它是引用类型。该数组确实在您的模型实例之间共享,但这更像是 javascript 的一个怪癖,而不是使用 Backbone.

创建 class 变量的预期方式

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

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

如果您想使用 class 属性,那么 Backbone 文档的这一部分是相关的:http://backbonejs.org/#Model-extend

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

To create a Model class of your own, you extend Backbone.Model and provide instance properties, as well as optional classProperties to be attached directly to the constructor function.

我在这里 https://jsfiddle.net/zn6bu4uf/3/ 用这段代码 fork 你的 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

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

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

数组在对象之间共享,因为没有对数组存储位置的分配。推送改变数组本身。

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

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

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

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

规格