你的两个选择并没有太多的优点或缺点,更多的是关于个人偏好。两者都可以调整,以提供更好的范围。
我有我自己的偏好,它依靠Underscore。它并没有真正促进私有变量或函数,但我很少发现这是一个问题。如果你想介绍jQuery等,最好用一个匿名函数包装为$
实际上是jQuery
(或可互换的图书馆)。如你在下面看到的,我的首选项需要更多的代码才能让你走(尽管有些不是必需的),但是试过了你最初提出的一些变体,我发现我的解决方案使其更易于理解代码,其他开发人员更容易掌握正在发生的事情,特别是如果他们具有Backbone.View
的经验。
编辑:包装在一个匿名函数来演示集成jQuery和受保护的范围。
var MyNamespace = MyNamespace || {};
(function($, MyNamespace) {
MyNamespace.MyModule = function(options) {
this.defaults = this.defaults || {};
// have had trouble with _.defaults so _.extend instead
this.options = _.extend({}, this.defaults, options);
this.initialize.call(this);
// define private stuff in here if you want
};
_.extend(MyNamespace.MyModule.prototype, {
defaults: {
myOption: "test"
},
initialize: function()
{
// ensure this always refers to our MyModule instance
_.bindAll(this);
this.$el = $("#some-widget");
// Look Ma! log is already binded to this!
this.$el.on("click", this.log);
},
setMyOption: function(value)
{
this.options.myOption = value;
},
log: function()
{
console.log("myOption: ", this.options.myOption);
}
});
})(jQuery, MyNamespace)
var myModule = new MyNamespace.MyModule({ myOption: "Hey SO!" });
myModule.log(); // -> myOption: Hey SO!
myModule.setMyOption("Setter");
myModule.log(); // -> myOption: Setter