どちらのオプションも賛否両論の方法ではあまり意味がありませんが、それはもっと個人的な好みです。両方を調整することで、より良いスコープを提供することができます。
私は自分の好みがあり、それはUnderscoreに依存しています。それは実際に私的な変数や関数を宣伝するものではありませんが、私はめったにこれを見つけることはできません。 jQueryなどを導入したい場合は、$
への無名関数を実際にはjQuery
(または交換可能なライブラリ)にラップするのが最善です。
以下に示すように、私の好みでは、(あなたの一部は必要ではありませんが)少しだけコードを入力する必要がありますが、最初に提案したもののいくつかのバリエーションを試してみました。他の開発者が何が起こっているのか把握するのは、特にBackbone.View
の経験がある場合には、より理解しやすいコードに役立ちます。
EDIT: 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