Javascript 如何覆盖jquery插件中的js函数并访问私有成员

Javascript 如何覆盖jquery插件中的js函数并访问私有成员,javascript,jquery-plugins,overriding,Javascript,Jquery Plugins,Overriding,我想知道是否有人能帮忙 我有一个jQuery插件,代码如下: .... $.Autocompleter.Select = function (options, input, select, config) { var list; .... return { emptyList: function (){ list && list.empty(); } } } originalAutoC

我想知道是否有人能帮忙

我有一个jQuery插件,代码如下:

....

$.Autocompleter.Select = function (options, input, select, config) {
    var list;

    ....

    return {
        emptyList: function (){
            list && list.empty();
        }
    }
}
originalAutoCompleteSelectFunction = $.Autocompleter.Select;
$.Autocompleter.Select = function (options, input, select, config) {
    var ret = originalAutoCompleteSelectFunction.apply(this, arguments);

    ret.emptyList = function() {
        console.log ("hello");
        console.log ("The list=" + list);
    };

    return ret;
};
我想重写emptyList函数;并编写了以下代码:

....

$.Autocompleter.Select = function (options, input, select, config) {
    var list;

    ....

    return {
        emptyList: function (){
            list && list.empty();
        }
    }
}
originalAutoCompleteSelectFunction = $.Autocompleter.Select;
$.Autocompleter.Select = function (options, input, select, config) {
    var ret = originalAutoCompleteSelectFunction.apply(this, arguments);

    ret.emptyList = function() {
        console.log ("hello");
        console.log ("The list=" + list);
    };

    return ret;
};
这算是可行的,但是:

  • 我的emptyList实现运行——我在控制台上看到“hello”——但emptyList的原始实现也运行。所以它不是一个真正的重写函数,是吗?它更像是一种增强
  • 我似乎无法访问变量“列表”
  • 所以,有两个问题。我是否正确编写了代码以真正覆盖现有函数?还有,是否可以访问变量“list”?我知道它是闭包的私有成员,但是如果您不能以这种方式访问私有成员,那么可能会使重写函数(使用这些私有成员)的功能变得毫无意义

    还是我错过了什么

    我已经看过了,它给了我如何以这种方式重写函数的方向;这也表明访问闭包的私有成员是不可能的

    干杯


    Nathan

    我试过console.log(“list=“+this.list”);但这不起作用,我还尝试创建了一个getter函数:ret.getList=function(){return this.list;}虽然我可以调用getter,但它仍然无法访问'list'变量。这可能是不可能的。也许只是改变插件本身。或者,检查它是否提供回调函数选项,允许您执行任何您尝试执行的操作。我真的不想更改插件源代码-这看起来很糟糕(您希望有人入侵您的代码吗?如果有,您会支持他们吗?(不是说我们获得了对该插件的支持))。我的第一个想法是回电话,但我不认为它是这样写的,因此想覆盖一些functions@ScottE-是的,没错;但对于任何类型的覆盖,无论我是否访问私人成员,都可以这样说。重写一个函数/方法/任何东西大概是因为基本功能没有达到我现在想要的效果?