apply,call,bind的实现

        Function.prototype.myApply = function (context) {
            if (typeof this !== 'function') {
                throw new TypeError('error')
            }

            let result = null;
            context = context || window;
            context.fn = this;
            if (arguments[1]) {
                result = context.fn(...arguments[1]);
            } else {
                result = context.fn();
            }

            delete context.fn;

            return result;
        }

        Function.prototype.myCall = function (context) {
            // 判断调用对象是否为函数, this表示调用的函数consoleStr
            if (typeof this !== 'function') {
                throw new TypeError('error');
            }

            let args = [...arguments].slice(1), result = null;

            //判断context是否传入,没有传入,则设置为window
            context = context || window;

            // 将调用函数设置为对象的方法
            context.fn = this;

            // 调用函数
            result = context.fn(...args);

            // 删除属性
            delete context.fn;

            return result;
        }

        const consoleStr = function (val) {
            console.log(val);
        }

        // consoleStr.myCall(this, 2);

        Function.prototype.myBind = function (context) {
            // 判断调用对象是否为函数
            if (typeof this !== "function") {
                throw new TypeError("Error");
            }

            // 获取参数
            var args = [...arguments].slice(1),
                fn = this;

            return function Fn() {
                /* 根据调用方式,传入不同绑定值
                    判断函数作为构造函数的情况,这个时候需要传入当前函数的 this 给 apply 调用,
                    其余情况都传入指定的上下文对象。
                */
                return fn.apply(
                    this instanceof Fn ? this : context,
                    args.concat(...arguments)
                );
            };
        };
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值