单手一个八拍带你实现一个call() ~~skr skr

  • call() 方法调用者是一个函数体 (this 指向,谁调用该方法,this就指向谁) 所以 可以将该函数体 赋值给目标对象的一个属性 , 这样该对象就有了这个方法
    1. 调用该方法传入可选参数
    1. 删除掉 赋值给 该对象的自定义方法
Function.prototype.myCall = function (targetObj, paramter) {
    targetObj.fn = this; //     1. 将要调用的函数体 赋值给目标对象的属性
    targetObj.fn(...paramter) //  2. 目标对象调用该方法 
    delete targetObj.fn; // 3. 删除之前赋值给目标对象的方法
}
// 思考: 加入该对象上已经有了 fn 属性 ,那上面的代码是不是会将原有的值覆盖掉 ,所有我们要确保他的唯一性
// 通过 Es6 的Symbol来解决这个问题
Function.prototype.my_Call = function (context, paramter) {
    if (typeof context === "object") {
        context = context || window;

    } else {
        Object.create(null)
    }
    let fn = Symbol()
    context[fn] = this;
    const result = context[fn](...paramter);
    delete context.fn;
    return result;
}
obj1.sayHello.my_Call(obj_2, 'my_Call');

怎么样, 是不是很skr!

你可能感兴趣的:(单手一个八拍带你实现一个call() ~~skr skr)