这个怎么样?:
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]);
}
前者将被称为 aswrapperitize(this, this.Bar, 'trigger', 'bind')
而后者被称为wrapperitize(this, 'Bar', 'trigger', 'bind')
(不同之处在于前者将成为当前this
的包装器this.Bar
,而后者将成为未来可能成为的this
任何东西的包装器。this.Bar
(顺便说一句,注意一点点递归。这是为了避免有问题的变量捕获,因为闭包在 JavaScript 中的工作方式。)