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 将您的属性(n
和 arr
)添加到 myModel
原型。
因为所有 myModel
对象的 __proto__
中都有 n
和 arr
并且可以访问它们。
数组在对象之间共享,因为没有对数组存储位置的分配。推送改变数组本身。
但是 increment 实际上是创建新值,然后将其分配给对象。
来自规范:
test1.n++
实际上会这样做
- 从对象
test1
中获取 属性 n
(如果不存在,请在 test1.__proto__
中搜索 ...)并将其保存为虚拟变量 old_val
。
- 设置虚拟变量
new_val
为old_val + 1
- 将对象 "test1" 中 属性
n
的值设置为 new_val
的值
- return
old_val
根据规范步骤 3,不检查 属性 n
的初始位置。它将添加新的 属性 到 test1
.
规格
我对实例和 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 将您的属性(n
和 arr
)添加到 myModel
原型。
因为所有 myModel
对象的 __proto__
中都有 n
和 arr
并且可以访问它们。
数组在对象之间共享,因为没有对数组存储位置的分配。推送改变数组本身。
但是 increment 实际上是创建新值,然后将其分配给对象。
来自规范:
test1.n++
实际上会这样做
- 从对象
test1
中获取 属性n
(如果不存在,请在test1.__proto__
中搜索 ...)并将其保存为虚拟变量old_val
。 - 设置虚拟变量
new_val
为old_val + 1
- 将对象 "test1" 中 属性
n
的值设置为new_val
的值
- return
old_val
根据规范步骤 3,不检查 属性 n
的初始位置。它将添加新的 属性 到 test1
.
规格