javascript - 如何覆盖 javascript 中返回的嵌套方法?

标签 javascript underscore.js overriding wrap-function

假设我正在使用一个代码如下所示的库:

(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);

它有一个插件系统,可以提供对 this 的访问,其中 this 是一个 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);
});

这个问题可能会在这里得到解答,但我真的不知道用什么词来描述这种编码风格,所以很难搜索。如果您让我知道将其称为嵌套返回方法是否正确,可加分?

最佳答案

此模式称为 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);
});

关于javascript - 如何覆盖 javascript 中返回的嵌套方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29752720/

相关文章:

javascript - 如果另一个 div 具有特定文本,则隐藏 div

javascript - 在 AngularJS 中定义服务和工厂的正确方法

javascript - 如何在 ruby​​ on Rails 和 Javascript 中向现有 JSON 对象添加另一个值?

javascript - 单击元素时一种模式呈现不同的模板

javascript - 在 typescript 中使用 underscore.js "debounce"函数

c++ - 编译器如何区分重载函数

javascript - 如何使用 IE 11 和 Firefox 36 调试 StealJS?

javascript - 在下划线模板中调用函数

java - C# 重写对象声明中的方法,就像在 Java 中一样

HTML <select> 已应用锁定的 CSS,我希望它显示为浏览器默认值