Как переопределить "приватную" функцию в javascript - PullRequest
0 голосов
/ 05 марта 2020

Я объясню проблему, которую я решаю, на примере.

Обычно я определяю свои собственные библиотеки в 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
})();

Теперь я хочу выполнить переопределяемый метод в качестве обратного вызова из события click. Я хотел бы сделать это:

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

Затем в библиотеке я объявляю обратный вызов "myMethod", который вызывает другой "переопределенный" метод publi c, который я хочу использовать глобально, "вне библиотеки" :

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

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

Здесь возникает проблема. Если я переопределю «переопределенный» метод следующим образом:

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

Тогда обратный вызов событий click будет продолжать генерировать исходный «publi c .override», который выводит «Override this!» сообщение вместо значения параметра.

Как переопределить метод publi c для переопределения обратного вызова вне библиотеки ??

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 05 марта 2020

Вы всегда можете навсегда изменить реализацию publi c, но я предполагаю, что вам нужно временное переопределение. Если так, то я думаю, что вам лучше всего переделать библиотеку. Если вам нужно иметь возможность динамически изменять поведение, вам нужен ваш API для его поддержки.

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

myLib.myMethod () // uses default behavior

// ...

myLib.myMethod (overridingFunction) // overrides that behavior.
0 голосов
/ 05 марта 2020

Фрагменты, которые вы дали, уже являются правильным способом сделать это. Если у вас возникли проблемы, это из-за некоторых деталей в вашей реализации - например, если вы храните 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()">
...