v2666
V2EX  ›  问与答

问一个 javascript 问题

  •  
  •   v2666 · Sep 12, 2018 · 1772 views
    This topic created in 2888 days ago, the information mentioned may be changed or developed.
    比如定义

    function a(){};
    function b(){};

    两个空 function

    在不改变原有函数内部代码的情况下
    在外部往 a 和 b 里面注入代码,当执行 a 或 b 的时候,会执行新注入的代码


    如:想把 console.log(arguments.callee.name) 这段代码注入到 a 和 b 中,该怎么做呢?




    a(); //输出 console.log('a');
    b(); //输出 console.log('b');

    等同于:function a(){ console.log(arguments.callee.name)}
    等同于:function b(){ console.log(arguments.callee.name)}

    ----------------------
    自己尝试修改 Function.prototype 包括 Object.prototype 都没实现

    遍历所有 function 的方法也想过,这种性能上不行
    4 replies    2018-09-13 08:38:48 +08:00
    rabbbit
        1
    rabbbit  
       Sep 12, 2018
    function a(){};
    let p = new Proxy(a, {
    apply(target, object, args) {
    console.log(target.name);
    return Reflect.apply(target, object, args);
    }
    })
    p() // a
    noe132
        2
    noe132  
       Sep 12, 2018
    替换原有函数。

    比如
    var originAlert = window.alert
    window.alert = (...p) => { originAlert(...p); console.log('hi'); }

    不过这个有一个问题,就是如果其他地方事先拿到了原函数的引用,而不是通过某一个对象的属性去查找,这个方式是无效的
    v2666
        3
    v2666  
    OP
       Sep 13, 2018 via Android
    @rabbbit
    想调用 a() 达到这个效果
    v2666
        4
    v2666  
    OP
       Sep 13, 2018 via Android
    @noe132
    上万个方法函数呢?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1003 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:16 · PVG 07:16 · LAX 16:16 · JFK 19:16
    ♥ Do have faith in what you're doing.