美文网首页JavaScript 进阶营
单手一个八拍带你实现一个call() ~~skr skr

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

作者: sherlockAndy | 来源:发表于2019-07-19 22:25 被阅读0次
    • 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

        本文链接:https://www.haomeiwen.com/subject/ahuelctx.html