Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中重写返回的嵌套方法?_Javascript_Underscore.js_Overriding_Wrap Function - Fatal编程技术网

如何在javascript中重写返回的嵌套方法?

如何在javascript中重写返回的嵌套方法?,javascript,underscore.js,overriding,wrap-function,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.libr

假设我使用的库的代码如下所示:

(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);
它有一个插件系统,提供对这个对象的访问,这个对象是
对象{init:function,keydown:function…}
。我想覆盖keydown.init函数。通常情况下,我可以看到使用类似于u.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);
});
这个问题可能会在这里得到回答,但我真的不知道用什么词来描述这种编码风格,所以很难搜索。如果您让我知道将其称为嵌套返回方法是否正确,您将获得额外的积分。

此模式称为嵌套返回方法。在这里,您可以做的最好的事情是缓存要覆盖的方法,并在覆盖中调用缓存的方法:

somefunc._init = somefunc.init;
somefunc.init = function () {
    doStuff();
    this._init();
};
我检查了u.wrap,它也做了同样的事情,正如另一个答案所指出的那样,您缺少的是
somefunc
的上下文。为了防止出现这种情况,您可以执行以下操作:

somefunc.init = _.wrap(_.bind(somefunc.init, somefunc), function (oldRef, args) {
    doStuff();
    oldRef.call(this.args);
});
这种模式称为a。在这里,您可以做的最好的事情是缓存要覆盖的方法,并在覆盖中调用缓存的方法:

somefunc._init = somefunc.init;
somefunc.init = function () {
    doStuff();
    this._init();
};
我检查了u.wrap,它也做了同样的事情,正如另一个答案所指出的那样,您缺少的是
somefunc
的上下文。为了防止出现这种情况,您可以执行以下操作:

somefunc.init = _.wrap(_.bind(somefunc.init, somefunc), function (oldRef, args) {
    doStuff();
    oldRef.call(this.args);
});

问题是您的方法在上下文之外运行

您需要设置其
上下文(为此使用
.bind()


问题是您的方法在上下文之外运行

您需要设置其
上下文(为此使用
.bind()

您需要修饰(阅读:wrap)键下功能,以便可以包装它返回的对象的
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;
});
您需要修饰(阅读:wrap)键下功能,以便可以包装它返回的对象的
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;
});


你用的是什么?看起来像下划线。jsyes,下划线wrapWhat
.wrap
你用的是什么?看起来像下划线。jsyes,下划线wrapI认为下划线。wrap函数使用的是。partial,而partial又做了类似于绑定的事情…它做了,但之前你已经失去了上下文。当您使用
somefuc.init
作为引用时,您就失去了
somefuc
的上下文,我认为下划线uu.wrap函数使用了uu.partial,这反过来又做了类似于绑定的事情……它确实做了,但在此之前您已经失去了上下文。当您使用
somefuc.init
作为参考时,您就失去了
somefuc
的上下文,这不是吗?和/或在这种情况下,uu.wrap不起作用的原因是什么?@funkyeah我不知道u.wrap起什么作用,所以我检查了GH上的文档和代码并更新了我的答案。这不是uu.wrap起的作用吗?和/或在这种情况下,u.wrap不起作用的原因是什么?@funkyeah我不知道什么是u.wrap,所以我检查了GH上的文档和代码并更新了我的答案。这似乎是最接近的答案,因为其他人并没有真正考虑按键对象。我玩了一点,试图让它充分发挥作用,但我一直遇到一个具体的问题。在实际库中,而不是在我的简化中,它们使用somefunc.keydown.init。我不明白他们在没有先执行keydown()的情况下是如何做到这一点的,但这确实发生了。当我实现此功能时,该代码不再有效。我将尝试在上面提供更多的上下文。哦,这个…但是它仍然可以与
$.Library.prototype.keydown
一起使用。可能
.keydown
值的函数表达式实际上是IEFE?你能在这里链接库源代码吗?我不能准确链接,因为库是封闭源代码,但我正在为Redactor编写一个插件:上面的示例是一个通用示例。现在在你的评论中还有很多其他的东西我不明白,所以我需要去读一读!嗯,也许
Redactor
会在需要插件时动态“安装”插件,然后调用函数。在覆盖时,您应该检查……keydown的
类型是否为
“function”
,然后像在我的答案中那样包装它;如果它是一个带有
init
方法的对象,那么就把它包装起来。这似乎是最接近的答案,因为其他人没有真正考虑keydown对象。我玩了一点,试图让它充分发挥作用,但我一直遇到一个具体的问题。在实际库中,而不是在我的简化中,它们使用somefunc.keydown.init。我不明白他们在没有先执行keydown()的情况下是如何做到这一点的,但这确实发生了。当我实现此功能时,该代码不再有效。我将尝试在上面提供更多的上下文。哦,这个…但是它仍然可以与
$.Library.prototype.keydown
一起使用。可能
.keydown
值的函数表达式实际上是IEFE?你能在这里链接库源代码吗?我不能准确链接,因为库是封闭源代码,但我正在为Redactor编写一个插件:上面的示例是一个通用示例。现在在你的评论中还有很多其他的东西我不明白,所以我需要去读一读!嗯,也许
Redactor
会在需要插件时动态“安装”插件,然后调用函数。在覆盖时,您应该检查……keydown
类型是否为
“function”
,然后像在我的答案中那样包装它;如果它是一个具有
init
方法的对象,只需将其包装即可。