JavaScript中的函数劫持实例详解

小云云
Lepaskan: 2018-03-16 17:34:17
asal
1824 orang telah melayarinya


函数劫持,顾名思义,即在一个函数运行之前把它劫持下来,添加我们想要的功能。当这个函数实际运行的时候,它已经不是原本的函数了,而是带上了被我们添加上去的功能。这也是我们常见的钩子函数的原理之一。  
乍一看上去,这很像是函数的改写。函数的改写也可以理解为是函数劫持的一种,但是这种方式太恶心了。作为一个劫持者,在绑票获得好处以后也应该遵守职业道德,把人原封不动地还回去,所以我们得在合适的地方把函数原本的功能给重新调用回来。
推而广之,其实“劫持”这一概念我们经常会遇到,比方说某网站被运营商劫持了,在浏览该网站的时候会弹出运营商的广告。

举例

现在我们来举个简单的例子,劫持一下alert()函数,为它增添一点小小的功能:

let warn = alertwindow.alert = (t) => {    if (confirm('How are you?')) warn(t)
}

alert('Help me...!!!')
Salin selepas log masuk

可以打开开发者工具尝试一下这个例子,你会发现只有你在confirm里面点击了OK,才会弹出Help me…!!!。
接下来我们把这部分的内容封装一下,成为一个通用的函数:

const hijack = (obj, method, fun) => {
  let orig = obj[method]
  obj[method] = fun(orig)
}
Salin selepas log masuk

首先我们定义了一个hijack函数,它会先把原函数给保存下来,然后执行自定义函数,而原函数将会在自定义函数内部进行调用。
然后我们来劫持confirm()函数:

hijack(window, 'confirm', (orig) => {  return (text) => {
    alert('HELP ME PLZ!!!')    if (orig.call(this, text)) {
      alert('YOU SEEMS FINE AND I AM LEAVING, GOOD BYE!')
    } else {
      alert('HOLD ON! I AM COMING!!')
    }
  }
})
Salin selepas log masuk

这段函数的功能很简单就不详细说明了,直接调用confirm()你就知道了:

反劫持

新建一个页面,打开你的开发者工具控制台,输入alert,你会看到这样的输出:

function alert() { [native code] }
Salin selepas log masuk

然后使用本文开头的那段代码,把alert()劫持一下,再重新在控制台输入alert,你会看到这样的输出:

function (t) => {    if (confirm('How are you?')) warn(t)
}
Salin selepas log masuk

通过上述的例子可以知道,要看一个函数是否被劫持了,只需要直接把它打印出来即可。针对系统原生的函数,[native code]即代表它是纯净无污染的。

相关推荐:

浅谈javascript函数劫持[转自xfocus]_javascript技巧

Atas ialah kandungan terperinci JavaScript中的函数劫持实例详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan