利用call或者apply实现bind方法,注释简单清晰!

本文介绍了JavaScript中apply、call和bind方法的区别,并重点讲解如何利用call和apply实现bind方法。bind方法创建一个新的函数,需手动调用,而call和apply直接执行。示例中展示了如何在Function.prototype上定义myBind方法,改变this指向并实现类似bind的功能。
摘要由CSDN通过智能技术生成

1.众所周知,apply方法和call、bind方法的不同之处是它们的传参形式,前者是通过数组的方式去传参,而后者则是通过参数列表的方式传参。

2.那么bind方法和call、apply方法的不同之处是,bind 是创建一个新的函数,我们必须要手动去调用,而后者不会。

3.总之它们的共同特点就是改变this的指向,下面呢。就给大家看看我使用call以及apply方法去实现自己的bind方法。

    <script>
        // 利用call或者apply实现bind方法
        // 在函数原型上面定义myBind方法
        Function.prototype.myBind = function () {
            // 判断调用它的是否为函数,不是的话就抛出错误
            if (typeof this !== 'function') {
                throw new TypeError('Error')
            }
            // 保存this的指向obj2
            const _this = this;
            const arg = [].shift.call(arguments); //将删除的obj1对象返回给arg接收
            const args = [].slice.call(arguments); //["动物"]

            return function () {
                // 通过apply方法参数传的是数组
                // _this.apply(arg,[].slice.call(args,[].slice.call(arguments)))
                // 通过call方法传的是参数列表
                _this.call(arg, ...args, ...[].slice.call(arguments))
            }
        }
        let obj1 = {
            name: "猫",
            color: "red",
            food: "鱼"
        }
        let obj2 = {
            name: "狗子",
            color: "yellow",
            food: "骨头",
            run(animal) {
                console.log(`${this.name}喜欢吃${this.food}它是${animal}`);
            }
        }
        // obj2.run('动物');//此时this指向的是obj2
        // 使用新的变量接收myBInd返回的新的函数
        const newF = obj2.run.myBind(obj1, "动物");//通过myBind方法改变this指向,让其指向obj1
        newF();
    </script>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值