覆盖对象内部的函数,调用其初始实现

时间:2019-02-09 09:51:03

标签: javascript html function oop

此代码伪装为覆盖函数print('this is Python stuff', 5+10) !. path/to/testAllLatin.sh print('is it all latin?') ,该函数已经在helper.highlight之前作为参数传递给字符串。覆盖之后,应该将###附加到字符串中。

这里有一个重要的细节,那就是该函数的新实现(重写)需要利用原始实现。

###

该代码可以正常运行,如您在此处看到的那样:

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

我想知道的是::是否可以在不使用其他变量的情况下完成函数覆盖,例如:<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> 。寻找一种更清晰的方法来实现这一点。

有什么想法吗?

请尽可能在上方插入我的prevHighlight并将新链接粘贴到您的答案上。

谢谢!

2 个答案:

答案 0 :(得分:0)

这种方法装饰了原始功能:

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

答案 1 :(得分:0)

我认为这是不可能的。看看这个:

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

如您所见,highlight将以这种方式递归。