これはどう?:
var Toolbar = {
init: function(toolbar) {
this.Bar = $(toolbar); // scope is Toolbar object literal
this.trigger =
function() { this.Bar.trigger.apply(this.Bar, arguments); };
this.bind = function() { this.Bar.bind.apply(this.Bar, arguments); };
this.Bar.find('clearButton').click(function() {
this.trigger('clear');
}
};
Toolbar.init();
Toolbar.bind('clear', function() { ... });
必要に応じて、ラッピングを処理する関数を簡単に作成できます。好みに応じて、これらのいずれか:
function wrapperitize(wrapper, wrappee, method /*, more_methods...*/)
{
wrapper[method] = function() { wrappee[method].apply(wrappee, arguments); };
for(var i = 3; i < arguments.length; ++i)
wrapperitize(wrapper, wrappee, arguments[i]);
}
function wrapperitize(wrapper, wrappeeProp, method /*, more_methods...*/)
{
wrapper[method] = function()
{
wrapper[wrappeeProp][method].apply(wrapper[wrappeeProp], arguments);
};
for(var i = 3; i < arguments.length; ++i)
wrapperitize(wrapper, wrappeeProp, arguments[i]);
}
ここで、前者は as と呼ばれwrapperitize(this, this.Bar, 'trigger', 'bind')
、後者はas と呼ばれますwrapperitize(this, 'Bar', 'trigger', 'bind')
(違いは、前者は現在this
の状態のラッパーにthis.Bar
なり、後者は将来になる可能性this
のあるもののラッパーにthis.Bar
なるということです。
(ちなみに、ほんの少しの再帰に注意してください。これは、JavaScript でクロージャーが機能する方法に起因する問題のある変数のキャプチャを回避するためです。)