JavaScript——劫持

概念:

函数劫持,顾名思义,即在一个函数运行之前把它劫持下来,添加我们想要的功能。当这个函数实际运行的时候,它已经不是原本的函数了,而是带上了被我们添加上去的功能。这也是我们常见的钩子函数的原理之一。

劫持方法有以下几种:

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方法一样,是直接传入参数。

你可能感兴趣的:(JavaScript,前端,javascript)