js代码,如何改写系统函数?给系统函数增加钩子函数
发布于 作者:苏南大叔 来源:程序如此灵动~

本文做个修改javascript
系统函数的尝试,比如最常见的定时器函数setInterval()
。思路上比较容易理解,就是先保存老的函数,然后定义同名的目标函数,在定义中再做自己的修改,最后再调用原函数。

大家好,这里是被网站备案中心反复折磨的苏南大叔的博客,这里记录苏南大叔和计算机代码的故事。本文以改写javascript
的setInterval()
为例,探讨改写系统函数的可能性。测试环境:win10
,chrome@105.0.5195.102
。
范例例子
下面的是个改写系统setInterval()
的例子。当然,如果要下钩子的话,写法基本类似。
这里原版的效果是:每隔一秒输出“原版原版原版”。修改后的效果是:每隔一秒输出“新版新版新版”。

代码解说
原理在文章开头就已经说过了,这里再复述一次,先用个变量保存原函数,然后修改函数逻辑,然后定义同名的函数,在函数内部再去调用原函数,逻辑就是这么清晰。

replace
几次
这里就特别说明一下修改逻辑时的replace
函数,因为默认情况下,javascript
的replace
函数,只替换一次,这个是个超级大坑。所以想清楚,自己想要的是普通就替换第一个匹配项目的replace
。还是需要替换所有内容的正则表达式写法。
普通只替换一次的replace()
:
替换所有内容的replace()
:
正则表达式的写法,要注意转义,比如代码中常见的“()”都是要进行转义的。"\(\)"。
匿名函数
setInterval()
的第一个参数是个匿名函数,但是把它传入到new Function()
的话,会报错。
那么,解决方案就是:做个函数名字。因为字符串是个函数模样,又加了一个自执行的代码,再整体放到匿名函数里面了。有点绕对不?
改进写法
实际上上面的代码,存在着一定的瑕疵。比如setInterval()
第一个参数传递的是下面这个形式的匿名函数的时候,就会报错了。
所以,上面的setInterval()
的改写代码需要再次改进。参考如下:
下面两种写法调用,都可以顺利执行。
仅供参考的代码
下面的代码,据原版说明,功用是对Function
整体进行改写原型链,具体点说就是消灭debugger
函数。苏南大叔试了一下,没有效果,改写失败。大家有知道如何使用的,可以留言。
debugger
这个特殊函数,似乎用本文的这种hook
方式也不能被修改。也许,就类似php
的eval
一样吧。属于特殊的函数。
相关链接
总结
没有啥可总结的,代码逻辑弄明白了,就可以hook
了。本文的主要目的是:js
的系统函数是可以被改写的!结束!


