1、Call 函数实现

// Call函数实现
Function.prototype.myCall = function(context) {
    // 判断对象
    if (typeof this !== "function") {
        console.error("Type Error");
    }
    // 获取参数
    let args = [...arguments].slice(1);
    let result = null;
    // 判断context 是否传入,如果未传入则设置为 window
    context = context || window;
    // 将调用函数设为对象的方法
    context._fn = this;
    // 调用函数
    result = context._fn(...args);
    // 将属性删除
    delete context._fn;
    return result;
}

2、Apply 函数实现

// Apply 函数实现
Function.prototype.myApply = function(context) {
    // 判断调用对象是否为函数
    if (typeof this !== "function") {
        throw new TypeError("Type Error");
    }
    let result = null;
    // 判断context 是否存在,如果未传入则为 window
    context = context || window;
    // 将函数设为对象的方法
    context._fn = this;
    // 调用方法
    let agrArr = arguments[1];
    if (Array.isArray(agrArr)) {
        result = context._fn(...agrArr);
    } else {
        result = context._fn();
    }
    // 将属性删除
    delete context._fn;
    return result;
}

3、Bind 函数实现

// Bind 函数实现
Function.prototype.myBind = function(context) {
    // 判断调用对象是否为函数
    if (typeof this !== 'function') {
        throw new TypeError("Type Error");
    }
    // 获取参数
    let args = [...arguments].slice(1);
    let fn = this;
    return function Fn() {
        // 根据调用方式,传入不同绑定值
        return fn.apply(
            this instanceof Fn ? this : context,
            args.concat(...arguments)
        );
    }
}