SOURCE

// 实现call函数步骤
// 1.判断调用对象是否为函数
// 2.判断上下文对象是否存在,不存在使用window
// 3.处理传入参数,截取第一个参数后的所有参数
// 4.将函数作为上下文的一个属性
// 5. 使用上下文调用这个方法,并保存返回结果
// 6.删除刚才新增的属性
// 7.返回结果
Function.prototype.myCall=function(context){
    // 判断调用对象是否为函数
    if(typeof this !=="function"){
        console.error("type err")
    };
    // 判断上下文是否存在,不存在使用window
    context = context || window;
    // 处理传入参数,截取第一个参数后的所有参数
    let args = [...arguments].slice(1);
    let result = null;
    // 将函数设置为上下文属性
    context.fn=this;
    // 调用函数并保存返回结果
    result=context.fn(...args);
    // 将刚才新增属性删除
    delete context.fn;
    // 返回结果
    return result;
}
// 测试是否myCall
var name="爸爸";
var age=45;
const obj={
    name:"大哥",
    age:18,
    say:function(){
        console.log(`我是${this.name}今年${this.age}`);
    }
}
const obj2={
    name:"弟弟",
    age:12
}
obj.say();
obj.say.myCall();
obj.say.myCall(obj2);


console 命令行工具 X clear

                    
>
console