当我在JavaScript中编写函数包装器时(例如:throttle
或debounce
函数),我希望能够检查'装饰'函数并仍然能够知道什么是潜在的功能。以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
。
然而,在覆盖原生功能时,我总是感到有些不安。在执行此操作时是否存在我应该担心的合规性和/或性能问题?
答案 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