为什么 Backbone.js 模型中的数组本质上是静态变量?
class exports.Content extends Backbone.Model
tags: []
那么如果我制作一些模型:
contentA = new Content()
contentB = new Content()
并向每个模型的数组添加一个字符串:
contentA.tags.push('hello')
contentB.tags.push('world')
它们最终都得到相同的数组:
contentB.tags // ['hello','world']
但如果是字符串,那就没有问题:
contentA.name = "c1"
contentB.name = "c2"
contentA.name // "c1"
最佳答案
简短回答
当您调用extends
来定义对象时,您将新对象的配置作为对象文字传递。对象通过引用传递,extends
函数仅将对标签数组的引用传递到新类型定义中。
正如其他人所指出的,您可以通过为函数分配标签
来纠正此问题。这是有效的,因为函数会延迟对标签的评估,直到实例化对象为止。 JavaScript 中没有任何原生工具可以执行此操作,但 Backbone 本身将标签
识别为函数或值。
长答案
尽管您的代码是在 CoffeeScript 中,但这可以归结为 JavaScript 中一些内容的组合:
- JavaScript 中没有类
- 立即计算对象字面量
- JavaScript 对象通过引用传递
在 JavaScript 中,没有类。时期。 CoffeeScript 为您提供了类的概念,但实际上,它被编译为没有类的 JavaScript。
您可以拥有类型和类型定义(构造函数),但不能拥有类。 Backbone 提供了类似类的定义,看起来类似于 Java 的“扩展”基于类的继承。但它仍然只是 JavaScript,没有类。
相反,我们拥有的是传递给 extends
方法的对象文字。就好像你编写了这段代码:
var 配置 = {
标签:[]
}
var MyModel = Backbone.Model.extends(config);
var MyModel = Backbone.Model.extends(config);
在此代码中,config
是对象文字、哈希值、键/值对或关联数组。无论你叫它什么名字,它的基本思想都是一样的。您最终会得到一个具有 tags
属性的 config
对象。 config.tags
的值是一个空数组 []
,它本身就是一个对象。
这让我们回到简短的答案:
当您调用extends
来定义对象时,您将新对象的配置作为对象文字传递。对象通过引用传递,extends
函数仅将对标签数组的引用传递到新类型定义中。
正如其他人所指出的,您可以通过为函数分配标签
来纠正此问题。这是有效的,因为函数会延迟对标签的评估,直到实例化对象为止。 JavaScript 中没有任何原生工具可以执行此操作,但 Backbone 本身将标签
识别为函数或值。
关于backbone.js - Backbone.js 模型中的数组本质上是静态的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17659751/