麻烦 JS 高手给解释一下这段代码的执行原理

2015-06-05 16:29:36 +08:00
 csensix
var ninja = {};

addMethod(ninja,'whatever',function(a){console.log(arguments.length);});
addMethod(ninja,'whatever',function(a,b){console.log(arguments.length);});
addMethod(ninja,'whatever',function(){console.log(arguments.length);});

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);
};
}

ninja.whatever();
2742 次点击
所在节点    问与答
20 条回复
Septembers
2015-06-05 16:39:27 +08:00
递归
learnshare
2015-06-05 16:41:30 +08:00
用来模拟函数重载。
zythum
2015-06-05 16:44:16 +08:00
模拟一个多态... fn.length 是这个方法行参的个数.
FrankFang128
2015-06-05 16:47:21 +08:00
不用学了,你懂 apply 和 arguments 怎样用就行了。

这是把 JS 不当 JS 用,不推荐。
Hyperion
2015-06-05 17:31:51 +08:00
用了一层层容器包裹来实现多态, 每add一次裹一层,参数个数对了就调用,否则就返回下一个。

@FrankFang128 逢小聪明必黑啊,但不了解这个,绝对不是什么好事。

我赌一块,近5年,这种做法还会存在,下一代javascript 的更迭,虽然不会和之前的javascript 统一那样,但也绝对不容易。
FrankFang128
2015-06-05 17:36:18 +08:00
@Hyperion 出现这种需求就是因为「我们的程序员只会用 Java / C#,JS 里没有重载他们觉得不可理喻」。
我觉得是因为某些程序员压根就不想学 JS 导致的。当然也无刻厚非。 这也说明了 JS 的灵活性。

不过初学者上来就学这个,很容易迷惑,说 JS 怎么这么烂,重载还要自己实现。
Hyperion
2015-06-05 17:37:36 +08:00
@FrankFang128 顺带吐槽一句,javascript 的oo,虽然实现不这么好看,但js 就是自由的。

顺便,我不觉得文不对题的回答别人问题,是什么对的做法。
Hyperion
2015-06-05 17:40:47 +08:00
@FrankFang128 oo只是组织代码方式而已,js没有但为了组织代码方便而去hack出一个,这不奇怪吧?

而且为啥一定要把lz 默认成初学者?
zythum
2015-06-05 17:41:57 +08:00
@FrankFang128
@Hyperion

哈哈哈,不要打架,不要打架。js好处都有啥。谁说对了就给他....
Hyperion
2015-06-05 17:43:29 +08:00
@zythum 朱一好久不见😘
zythum
2015-06-05 17:44:47 +08:00
@Hyperion 哈哈朱一一直在你身边啊...
jun4rui
2015-06-05 17:48:20 +08:00
@zythum 能操作DOM,PHP行不行?不行。C行不行?不行。Java行不行?不行。


这么牛逼你还不满足?
zythum
2015-06-05 17:50:09 +08:00
@jun4rui vb也可以 能操作DOM... 所以vb也很牛逼, 哈哈哈
Septembers
2015-06-05 17:54:52 +08:00
@FrankFang128 fp 的一个非常重要的概念是 幕等
FrankFang128
2015-06-05 17:56:10 +08:00
@Hyperion 2 楼已经给了正确答案了,所以我只是补充一下 :)
chairuosen
2015-06-05 17:56:22 +08:00
@zythum 原来你也在这里。。。我是上周打电话问顶导的那个。。^_^
zythum
2015-06-05 18:04:08 +08:00
@chairuosen 艸 ...能不谈公司的事情么....
nilennoct
2015-06-05 18:05:28 +08:00
ninja.whatever = function(options) {
options = options || {};
var a = options.a,
b = options.b;

console.log(a, b);
}
learnshare
2015-06-05 18:21:05 +08:00
其实 TypeScript 也有类似的功能: http://www.typescriptlang.org/Handbook#functions-overloads 不过 TypeScript 又完全是另一回事了。
Hyperion
2015-06-05 18:30:56 +08:00
@FrankFang128 求同存异😗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/196358

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX