函数劫持:即在一个函数运行之前把它劫持下来,添加我们想要的功能。

当这个函数实际运行的时候,它已经不是原本的函数了,而是带上了被我们添加上去的功能。这也是我们常见的【钩子函数】的原理之一。

示例:

对内置函数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指向上层已定义的对象,负责会出现错误

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值