概念:
函数劫持,顾名思义,即在一个函数运行之前把它劫持下来,添加我们想要的功能。当这个函数实际运行的时候,它已经不是原本的函数了,而是带上了被我们添加上去的功能。这也是我们常见的钩子函数的原理之一。
劫持方法有以下几种:
1. 黑客劫持
就是劫持网络数据包 ,然后暴力解码(逆向工程) , 窃取个人隐私数据 (此种方法感兴趣可以网上自学)
2. 系统内置功能的重写
就是将系统内置函数功能修改为自己想要实现的功能;也就是系统内置函数的改写
var _log = console.log
console.log = function(str) {
_log(str + " xiao zhang tong xue")
}
console.log("hello")
比如上面就是通过对console.log方法的重写,来实现无论用console.log方法来打印什么,打印出来的结果都会加上" xiao zhang tong xue"这个字符串。
3. this关键字的引用劫持
就是通过函数的一些特殊方法来自己指定函数的调用者
1. this的劫持1 —— call()方法
var obj = {
name: "kang",
fun: function(n1, n2) {
var age = n1
var height = n2
console.log(this.name)
console.log(age)
console.log(height)
}
}
var obj2 = {
name: "xiao zhang"
}
obj.fun.call(obj2, 21, 180)
上述就是通过函数的call方法将对象obj中fun方法的调用者改写为对象obj2,也就是将fun方法中的this指向改为obj2,所以最终打印出来的this.name就是obj2的name: xiao zhang。
2. this的劫持2 —— apply() 方法
var obj = {
name: "kang",
fun: function(n1, n2) {
var age = n1
var height = n2
console.log(this.name)
console.log(age)
console.log(height)
}
}
var obj2 = {
name: "xiao zhang"
}
obj.fun.apply(obj2,[21,180])
apply()方法和call()方法的作用和用法基本一致,唯一的区别是call方法的参数是直接放进去,用逗号隔开,而apply方法的所有参数必须放在一个数组中再传入。
这种方法也可以用来比较纯数字数组中的元素的最大值和最小值:
var arr = [10,230,40,6,2,5,3]
var maxnum = Math.max.apply(arr,arr)
//相当于arr.max(10,230,40,6,2,5,3)
var minnum = Math.min.apply(arr,arr)
//相当于arr.min(10,230,40,6,2,5,3)
console.log("max number = " + maxnum)
console.log("min number = " + minnum)
3. this的劫持3 —— bind()方法
var obj = {
name: "xiao zhang"
}
var obj2 = {
name: "kang",
fun: function(n1, n2) {
var age = n1
var height = n2
console.log(this.name)
console.log(age)
console.log(height)
}.bind(obj)
}
obj2.fun(21, 180)
bind()方法就是在函数设计的时候就指定函数的调用者,也就是指定函数中this的指向;其参数传入形式和call方法一样,是直接传入参数。