我的 Backbone.js 默认值应该是对象还是函数?

a64a0gku  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(137)

我一直在阅读和遵循几个backboneiderjs教程,当谈到模型的默认值时,人们似乎有两种方法之一。

第一种方式-默认为对象

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

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

这对我来说最有意义,我立即知道默认值是一个对象,它工作得很好。

第二种方式-默认值为函数

第二种方法是默认值被声明为一个函数,例如;

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

这个函数显然最终返回一个对象,对我来说没有什么意义(除非你最终想向函数传递一些东西。

我的问题

我的问题是,假设不使用函数方式传递任何参数,使用其中一种方法比使用另一种方法有什么好处吗?我的感觉是,调用匿名函数可能会有很小的开销,但我希望得到更明智的意见。

r6vfmomb

r6vfmomb1#

请记住,在JavaScript中,对象是通过引用传递的,因此如果您将对象作为默认值包含在内,则它将在所有示例之间共享。如果您不希望在所有示例之间共享对象,则应使用函数定义包含通过引用传递的对象的默认值
https://github.com/documentcloud/backbone/issues/1145
差不多可以总结一下了。函数方法只推荐在你有对象属性的时候使用。

zazmityj

zazmityj2#

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

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

至于好处。常规对象提供了一种静态的方式来声明模型默认值。你在扩展的时候声明它们,它们不会改变。另一方面,函数提供了一种能力,通过修改函数应该返回的对象,你可以改变fly的模型默认值,而不用重新创建整个类。

nvbavucw

nvbavucw3#

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

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

相关问题