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

问一个 javascript 问题

  •  
  •   me15000 · 2018-09-12 20:35:41 +08:00 · 1352 次点击
    这是一个创建于 2264 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如定义

    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 条回复    2018-09-13 08:38:48 +08:00
    rabbbit
        1
    rabbbit  
       2018-09-12 20:43:05 +08:00
    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  
       2018-09-12 20:44:08 +08:00
    替换原有函数。

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

    不过这个有一个问题,就是如果其他地方事先拿到了原函数的引用,而不是通过某一个对象的属性去查找,这个方式是无效的
    me15000
        3
    me15000  
    OP
       2018-09-13 08:38:06 +08:00 via Android
    @rabbbit
    想调用 a() 达到这个效果
    me15000
        4
    me15000  
    OP
       2018-09-13 08:38:48 +08:00 via Android
    @noe132
    上万个方法函数呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1257 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 18:08 · PVG 02:08 · LAX 10:08 · JFK 13:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.