假设我使用的代码如下所示:
(function($)
{
function Library(el, options)
{
return new Library.prototype.init(el, options);
}
Library.fn = $.Library.prototype = {
init: function(el, options) {
this.$elm.on('keydown.library', $.proxy(this.keydown.init, this));
}
keydown: function() {
return {
init: function(e) {
... somecode
},
checkStuff: function(arg1, arg2) {
...someCode
}
}
};
}
})(jQuery);
它有一个插件系统,可以访问Object {init: function, keydown: function...}
。我想覆盖keydown.init函数。通常我会看到像_.wrap这样的东西来做它:
somefunc = _.wrap(somefuc, function(oldfunc, args) {
donewstuff();
oldfunc.call(this.args);
});
但这似乎不适用于返回的嵌套方法,例如:
this.keydown.init = _.wrap(this.keydown.init, function(oldfunc, args) {
donewstuff();
oldfunc.call(this.args);
});
这个问题可能会在这里得到解答,但我真的不知道使用正确的词语来描述这种编码风格,因此难以搜索。如果您告诉我是否将其称为嵌套的返回方法,那么奖励积分是什么?
答案 0 :(得分:2)
此模式称为module。你可以做的最好的事情是缓存你想要覆盖的方法,并在你的覆盖中调用缓存的方法:
somefunc._init = somefunc.init;
somefunc.init = function () {
doStuff();
this._init();
};
我检查了_.wrap并且它做了同样的事情,另一个答案所指出的你遗失的是你正在失去somefunc
的上下文。为了防止你这样做:
somefunc.init = _.wrap(_.bind(somefunc.init, somefunc), function (oldRef, args) {
doStuff();
oldRef.call(this.args);
});
答案 1 :(得分:1)
问题是你的方法是在上下文之外运行的。
您需要设置其this
上下文(使用.bind()
为此)
somefunc.init = _.wrap(somefuc.init.bind(somefunc), function(oldfunc, args) {
donewstuff();
oldfunc.call(this.args);
});
答案 2 :(得分:1)
您将需要修饰(读取:包装)keydown
函数,以便您可以包装它返回的对象的init
方法:
somefunc.keydown = _.wrap(somefunc.keydown, function(orig) {
var module = orig(); // it doesn't seem to take arguments or rely on `this` context
module.init = _.wrap(module.init, function(orig, e) {
donewstuff();
return orig.call(this, e);
});
return module;
});