Переопределить функцию внутри объекта, вызывая его начальную реализацию - PullRequest
0 голосов
/ 09 февраля 2019

Этот код претендует на переопределение функции: helper.highlight, которая уже добавляла ### к строке, переданной в качестве аргумента.После переопределения предполагается, что он также добавляет ### к строке.

Здесь есть одна важная деталь: новая реализация (переопределение) функции должна использовать исходную реализацию.

<html>
<head>
<title>Test</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script>
window.addEventListener('load', function(){
  let output = document.querySelector('.message');
  let result = helper.highlight('Hello World');
  output.innerHTML = result;
});
helper = {
  highlight: str => {
    return '### ' + str;
  }
};
// BEGIN OF YOUR APPROACH
prevHighlight = helper.highlight;
helper.highlight = str => {
  str += ' ###';
  str = prevHighlight(str);
  return str;
};
// END OF YOUR APPROACH
</script>
</head>
<body>
  <span class="message"></span>
</body>
</html>

Код работает правильно, как вы можете видеть здесь:

https://codesandbox.io/s/2o503978m0

Что я хочу знать, это: еслиПереопределение функции может быть сделано без использования дополнительной переменной, как я делаю с: prevHighlight.Ищите более понятный способ сделать это.

Есть идеи по этому поводу?

Если возможно, пожалуйста, раскошелите мой codesandbox.io выше и вставьте новую ссылку в ваш ответ.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Я думаю, что это невозможно.Посмотрите на это:

helper.highlight = str => {
  str += ' ###';
  str = helper.highlight(str);//prevHighlight(str);
  return str;
};

Как видите, highlight станет рекурсивным таким образом.

0 голосов
/ 09 февраля 2019

Этот подход украшает исходную функцию:

Function.prototype.affixer = function() {
    var originalHighlight = this;
    var temp = function() {
      // this is not very robust and assumes there is always at least one argument
      arguments[0] += " ###";
      return originalHighlight.apply(this, arguments);
    };
    return temp;
};
helper.highlight = helper.highlight.affixer();

См. Раздвоенный пример здесь: https://codesandbox.io/s/726xw524z0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...