【发布时间】:2013-08-09 22:28:32
【问题描述】:
我目前正在通过John Resig 学习Secrets of the JavaScript Ninja,我希望有人可以帮助我进一步理解其中一个示例。
它是一个允许对对象进行方法重载的函数,每个重载都有自己的定义和行为。他在博客上写了here。
代码如下所示:
function addMethod(object, name, fn) {
var old = object[name];
object[name] = function(){
if (fn.length == arguments.length)
return fn.apply(this, arguments)
else if (typeof old == 'function')
return old.apply(this, arguments);
};
并像这样使用:
addMethod(obj,'funcName',function(){});
addMethod(obj,'funcName',function(a){});
addMethod(obj,'funcName',function(a,b){});
我想我了解它的大部分工作原理,但您可以得到比我从上面的博客文章中给出的更好的解释。
但是,它使用闭包访问old 和fn 的值,我还在研究。
编辑 - 在下方添加 jsFiddle。
当试图理解它时,我意识到 return fn.apply(this, arguments) 行可能只是 return fn() ,结果似乎相同。请参阅此 jsFiddle 中的示例。
那么,如果不需要,为什么要使用apply 语法?
我尝试在不应用的情况下使用jsFiddle 中的示例,但似乎总是不行
此外,当我们返回这些函数时究竟发生了什么,尤其是在以下情况下:
return old.apply(this, arguments);
我真的很想深入了解如何使用这种方法,以及它为什么有效,因此任何见解都将不胜感激。
谢谢
【问题讨论】:
-
感谢大家的所有回答。我会全部研究并接受最佳答案——不过,看起来似乎很难看到高质量的答案:)
标签: javascript closures