【问题标题】:Should my Backbone defaults be an object or a function?我的 Backbone 默认值应该是对象还是函数?
【发布时间】:2013-06-26 10:50:05
【问题描述】:

我一直在阅读和关注一些 Backbone.js 教程,当谈到模型的默认值时,人们似乎会选择两种方法之一。

第一种方式 - 默认是一个对象

第一种方式,例如将默认值声明为对象;

my_model = Backbone.Model.extend({
    defaults: {
        title: 'Default Title'
    }
});

这对我来说最有意义,我立即知道默认值是一个对象并且它工作正常。

第二种方式 - 默认值是一个函数

我看到的第二种方式是将默认值声明为函数,例如;

my_model = Backbone.Model.extend({
    defaults: function() {
        return {
            title: 'Default Title'
        }
    }
});

这个函数显然最终会返回一个对象,对我来说意义不大(除非你最终想将某些东西传递给函数。

我的问题

我的问题是,假设您不会使用函数方式传递任何参数,那么使用其中一个是否有好处。我的感觉是,调用匿名函数可能会产生微不足道的开销,但希望得到更明智的意见。

【问题讨论】:

    标签: backbone.js


    【解决方案1】:

    请记住,在 JavaScript 中,对象是通过引用传递的,因此如果您将对象作为默认值包含在内,它将在所有实例之间共享。如果您不希望在所有实例之间共享对象,则应使用函数定义包含通过引用传递的对象的默认值

    https://github.com/documentcloud/backbone/issues/1145

    总结得差不多了。仅当您具有对象属性时才建议使用函数方法。

    【讨论】:

    • 谢谢。我绞尽脑汁想弄清楚为什么在模型中实例化的集合可以从该模型的所有实例中访问。我想要每个模型中的新系列。使用函数就是答案。
    【解决方案2】:

    我认为您描述的两种技术之间没有任何性能差异。解析默认值的方式(= 调用的函数或仅返回的对象)由 underscore.js 中的this line 决定:

    return _.isFunction(value) ? value.call(object) : value;
    

    至于好处。常规对象提供了一种声明模型默认值的静态方式。您在扩展时声明它们,就是这样,它们不会改变。另一方面,该函数使您能够通过修改函数应该返回的对象来更改飞行的模型默认值,而无需重新创建整个类。

    【讨论】:

      【解决方案3】:

      使用函数而不是对象的另一个原因是,如果您的默认值之一取决于模型中的方法。

      例如

      defaults: function() {
          return {
              title: this.getTitle()
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-19
        • 2011-03-10
        • 2016-04-10
        • 2011-09-23
        • 1970-01-01
        • 2016-10-03
        • 2011-02-25
        • 2010-12-10
        相关资源
        最近更新 更多