函数劫持
前言
前段时间接手了一个shi一样的项目,各种代码触目惊心。一个文件里,一会儿4个空格缩进,一会儿2个空格缩进;各种magic number;函数形参a,b,c……
当然这篇也不打算吐槽,也不想说什么代码可读性的问题,只是想借这个机会谈一下维护这样的代码时候用到的一个小技巧。
函数劫持
第一次看到这个概念,是在一本web攻防的书籍上。作者提到了利用函数劫持来将一些敏感信息记录下来或者发送到黑客的服务器上。也在一个网站上键入alert时,发现并没有弹窗,而是在console中log了出来。
我猜测,大概代码如下:
window.alert = function (message) {
console.log('alert: ' + message.toString());
}
上面的这个例子是一个非常浅显的函数劫持,我们也可以加一点别的内容上去。
window.alert = function (message) {
console.log('alert: ' + message.toString());
reportToMyServer(message);//把信息上报到我们自己的服务器
}
劫持与屏蔽
先说一下需求,现在有一个修改url的函数,在许多地方被调用了,然后产品有一个小的临时的需求,在某些情况下,加一个参数上去,其他情况不加。
修改url的参数大概实现如下:
1.需要传入键值对
2.把键值对转换成url拼接的形式,拼到url上,之前拼接的参数,一概不要。
不要问我为什么要这么实现,我知道这个实现很奇怪,但是我也不打算修改他们的代码。只是一个小小的需求,我也不想在所以调用这个函数的地方,都再加一个键值对,太麻烦了,于是就想到了函数劫持。
实现
function changeUrl (obj) {
//我不想写具体实现了,诸君脑补
//就是host + orgin + 键值对
}
var
foo = changeUrl
;
changeUrl = function (obj) {
obj.myParameter = 'hello-world';
foo(obj);
}
例子很简单,道理也很容易看明白。我想说的是,函数劫持其实有一些封装的思想:我不关心这个方法怎么实现,我只关心结果。 其他的内容,内部实现,其实是对我们屏蔽的。
我们劫持的方法,根本不需要关心他做了什么,怎么做的,只需要加入我们想加入的东西即可。这种思维方式可以用在我们平时的编程上,尽可能封装好大部分实现,只将几个口暴露给用户来调用。
以上是个人理解,有不对的地方敬请指教。