在JavaScript中覆盖function.toString时我应该担心吗?

时间:2013-01-11 16:45:30

标签: javascript function overloading

当我在JavaScript中编写函数包装器时(例如:throttledebounce函数),我希望能够检查'装饰'函数并仍然能够知道什么是潜在的功能。以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

然而,在覆盖原生功能时,我总是感到有些不安。在执行此操作时是否存在我应该担心的合规性和/或性能问题?

1 个答案:

答案 0 :(得分:3)

在Mozilla开发人员小组中,他们更多地讨论了重写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