backbone.js - Backbone.js 模型中的数组本质上是静态的?

标签 backbone.js coffeescript

为什么 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/

相关文章:

javascript - 如何管理客户端 JavaScript 依赖项?

javascript - Rails 数据表选择过滤器

javascript - 如何在 JavaScript 中子类化/扩展 TypedArrays?

backbone.js - 使用Requirejs在Backbone中预编译Handlebars模板?

javascript - 主干 Js + Require Js + AmCharts

javascript - 没有 REST 使用 ASP .net webservice 的 Backbone.js

javascript - 如何将 Javascript/Coffeescript 整数数组传递到我的 Rails 应用程序?

javascript - Backbone View +谷歌可视化API

javascript - 将 Backbone 模型属性值设置为另一个模型

node.js - coffeescript 编译器的奇怪行为