我一直在阅读和关注几个Backbone.js教程,当谈到模型的默认设置时,人们似乎有两种方式。
第一种方法是将默认值声明为对象,例如;
my_model = Backbone.Model.extend({
defaults: {
title: 'Default Title'
}
});
这对我来说最有意义,我立即知道默认值是一个对象,它可以正常工作。
我看到的第二种方式是将默认值声明为函数,例如;
my_model = Backbone.Model.extend({
defaults: function() {
return {
title: 'Default Title'
}
}
});
这个函数显然最终会返回一个对象,对我来说没什么意义(除非你想最终将一些东西传递给函数。
我的问题是,假设您不会使用函数方式传递任何参数,使用一个优于另一个是否有好处。我的感觉是,通过调用匿名函数可能会有一个微不足道的开销,但会更喜欢更明智的意见。
答案 0 :(得分:6)
请记住,在JavaScript中,对象是通过引用传递的,因此如果将对象包含为默认值,则它将在所有实例之间共享。如果您不希望在所有实例之间共享对象,则应使用函数定义包含通过引用传递的对象的默认值
https://github.com/documentcloud/backbone/issues/1145
几乎可以总结一下。只有拥有对象属性时才建议使用函数方法。
答案 1 :(得分:1)
我认为您描述的两种技术之间没有任何性能差异。解析默认值的方式(=调用函数或仅返回对象)由underscore.js中的this line决定:
return _.isFunction(value) ? value.call(object) : value;
至于好处。常规对象提供了一种声明模型默认值的静态方法。你在扩展时声明它们就是这样,它们不会改变。另一方面,该函数使您能够通过修改函数应返回的对象来更改fly的模型默认值而无需重新创建整个类。