如何覆盖 javascript 中的 "private" 函数

How to override "private" function in javascript

我将用一个例子来解释我正在解决的问题。

我通常这样在js中定义自己的库:

window.myLib = (function () {
  var public = {}; // for storing public methods and values
  var private = {}; // for storing private methods and values

  // Atributes and methods here

  return public; // return the public part to be used globally
})();

现在我想执行一个可覆盖的方法作为单击事件的回调。我会这样做:

<input type="checkbox" id="mCheck" onchange="myLib.myMethod()">

然后,在库中我声明回调 "myMethod" 调用另一个我想全局使用的 public "overridable" 方法,"outside of the library":

  //...
  public.overridable = function(param){console.log("Override this!");};

  public.myMethod = function(){
    if(private.condition) // Just to put some logic
     public.overridable(private.value);
  };
  //...

问题来了。如果我像这样重新定义 "overridable" 方法:

  myLib.overridable = function(p){console.log(p)};

然后单击事件的回调继续触发原始 "public.override",它输出 "Override this!" 消息而不是参数值。

如何重写public方法在库外重新定义回调?

提前致谢。

您提供的片段已经是执行此操作的正确方法。如果您遇到问题,那是因为您的实现中的一些细节 - 例如,如果您将 public.overridable 存储在某个变量中并以这种方式调用它,而不是每次都引用 public.overridable

我已将您的代码片段放在下面的一个工作示例中,以表明它完全符合预期。

window.myLib = (function () {
  var public = {}; // for storing public methods and values
  var private = {}; // for storing private methods and values

  // Atributes and methods here
  public.overridable = function(param){console.log("Override this!");};

  public.myMethod = function(){
    if(private.condition) // Just to put some logic
     public.overridable(private.value);
  };

  private.condition = true;
  private.value = "test";

  return public; // return the public part to be used globally
})();

myLib.overridable = function(p){console.log(p)};
<input type="checkbox" id="mCheck" onchange="myLib.myMethod()">

您始终可以永久修改 public 实现,但我假设您需要的是临时覆盖。如果是这样,我认为您最好的选择是重新设计图书馆。如果你需要能够动态地改变行为,你需要你的 API 来支持它。

public.myMethod = function (impl = public.overridable) {
  if(private.condition)
     impl(private.value)
}
// ...

myLib.myMethod () // uses default behavior

// ...

myLib.myMethod (overridingFunction) // overrides that behavior.