当这个函数实际运行的时候,它已经不是原本的函数了,而是带上了被我们添加上去的功能。这也是我们常见的【钩子函数】的原理之一。
示例:
对内置函数consloe.log()进行劫持
//将console.log函数的原有功能保存到变量log中
let log = console.log;
console.log = function(str) {//对console.log进行劫持: 添加新的功能
log (str + '\tWord');//加入新的信息
};
console.log('Hello');
1.this关键字的引用劫持:
改变this的指向,通过一些特殊的方法来自己指定函数的调用者
(1)通过call()方法劫持this
(2)通过apply()方法劫持this
let obj = {
name:'杰克',
fun:function(a,b){
let age = a;
let height = b;
console.log('姓名:',this.name);
console.log('年龄:',age);
console.log('身高:',height);
}
};
let obj2 = {
name:'露丝',
};
obj.fun(22,'175cm');//未劫持
console.log('------------------');
obj.fun.call(obj2,25,'180cm');//通过调用call函数将fun函数中的this进行劫持,this指向了obj2
console.log('------------------');
obj.fun.apply(obj2,[30,'190cm']);//apply方法劫持
(3)通过bind()方法劫持this
let obj2 = {
name:'我是obj2的name法外狂徒',
age:'20',
height:'180cm'
};
let obj = {
name:'张三',
age:30,
height:'190cm',
fun:function(){
console.log('姓名:',this.name);
console.log('年龄:',this.age);
console.log('身高:',this.height);
}.bind(obj2),//this指向obj2
};
obj.fun();//调用fun函数,其中this指向obj2
bind()方法是在函数定义的时候就指定函数的调用者,即给定函数中this的指向;
其参数传入形式和call方法一样,是直接传入参数。
而apply()参数是以数组的方式传入
this指向上层已定义的对象,负责会出现错误