Как насчет этого? :
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]);
}
, где первый будет называться wrapperitize(this, this.Bar, 'trigger', 'bind')
, а второй - wrapperitize(this, 'Bar', 'trigger', 'bind')
(разница состоит в том, что первый превратит this
в обертку для любого значения this.Bar
, в то время как последний будет this
в обертку для того, что this.Bar
может когда-либо стать в будущем.
(Заметьте, к слову, немного рекурсии. Это позволяет избежать проблемного захвата переменных из-за того, как замыкания работают в JavaScript.)