你的兩個選擇並沒有太多的優點或缺點,更多的是關於個人偏好。兩者都可以調整,以提供更好的範圍。
我有我自己的偏好,它依靠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