2

当我在 JavaScript 中编写函数包装器(例如:athrottledebounce函数)时,我希望能够检查“装饰”函数并且仍然能够知道底层函数是什么。以一个实现throttle为例:

function throttle(fn, time) {
  var handle;

  var execute = function() {
    handle = null;
    fn.apply(this, arguments);
  };

  var throttled = function() {
    if(!handle) {
      handle = setTimeout(execute.bind(this), time);
    }
  };

  throttled.toString = function() {
    return fn.toString() + "\n// throttled to " + time + "ms";
  };

  return throttled;
}

var makeAjax = throttle(function(callback) {
  $.getJSON("/path", callback);
}, 500);

console.log(makeAjax);

console.log来电显示:

function (callback) {
  $.getJSON("/path", callback);
}
// throttled to 500ms

作为一个用户,throttle我更关心我给它的功能,而不是它的内部throttled

但是,在覆盖原生函数时,我总是感到有些不安。执行此操作时,我是否应该担心任何合规性和/或性能问题?

4

1 回答 1

3

在 Mozilla Developer Group 中,他们更多地讨论了覆盖 toString()。 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/toString

我认为这里可能存在的问题是创建自动化单元测试(我的经验仅限于 NUnit Selenium),您可能无法使用私有 .toString() 或者它可能导致不稳定的测试结果?调试也可能是一个问题!

要覆盖其他具有方法的本地 js 函数,您可能还需要手动扩展所有方法以替换被覆盖的内容。

Addy Osmani 在他的“学习 JavaScript 设计模式”一书中进一步讨论了这一点,http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript

于 2013-01-11T17:11:43.337 回答