V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
csensix
V2EX  ›  问与答

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

  •  
  •   csensix · 2015-06-05 16:29:36 +08:00 · 2733 次点击
    这是一个创建于 3245 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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();
    20 条回复    2015-06-05 18:30:56 +08:00
    Septembers
        1
    Septembers  
       2015-06-05 16:39:27 +08:00
    递归
    learnshare
        2
    learnshare  
       2015-06-05 16:41:30 +08:00
    用来模拟函数重载。
    zythum
        3
    zythum  
       2015-06-05 16:44:16 +08:00
    模拟一个多态... fn.length 是这个方法行参的个数.
    FrankFang128
        4
    FrankFang128  
       2015-06-05 16:47:21 +08:00
    不用学了,你懂 apply 和 arguments 怎样用就行了。

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

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

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

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

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

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

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


    这么牛逼你还不满足?
    zythum
        13
    zythum  
       2015-06-05 17:50:09 +08:00
    @jun4rui vb也可以 能操作DOM... 所以vb也很牛逼, 哈哈哈
    Septembers
        14
    Septembers  
       2015-06-05 17:54:52 +08:00
    @FrankFang128 fp 的一个非常重要的概念是 幕等
    FrankFang128
        15
    FrankFang128  
       2015-06-05 17:56:10 +08:00
    @Hyperion 2 楼已经给了正确答案了,所以我只是补充一下 :)
    chairuosen
        16
    chairuosen  
       2015-06-05 17:56:22 +08:00
    @zythum 原来你也在这里。。。我是上周打电话问顶导的那个。。^_^
    zythum
        17
    zythum  
       2015-06-05 18:04:08 +08:00
    @chairuosen 艸 ...能不谈公司的事情么....
    nilennoct
        18
    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
        19
    learnshare  
       2015-06-05 18:21:05 +08:00
    其实 TypeScript 也有类似的功能: http://www.typescriptlang.org/Handbook#functions-overloads 不过 TypeScript 又完全是另一回事了。
    Hyperion
        20
    Hyperion  
       2015-06-05 18:30:56 +08:00 via Android
    @FrankFang128 求同存异😗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1004 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 22:04 · PVG 06:04 · LAX 15:04 · JFK 18:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.