call

# call

# 描述:

参数

  • thisArg 可选的。在 function 函数运行时使用的 this 值。请注意,this可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动替换为指向全局对象,原始值会被包装。

call() 允许为不同的对象分配和调用属于一个对象的函数/方法。

call() 提供新的 this 值给当前调用的函数/方法。你可以使用 call 来实现继承:写一个方法,然后让另外一个新的对象来继承它(而不是在新对象中再写一次这个方法)。

# 分析:

call 方法实现的难点在于,我们如何去改变一个函数中的 this 。 是否还记得,在一个对象中,如果我们调用这个对象的函数,其中的 this 是什么? 是不是调用者也就是这个对象? 我们需要给传入的对象添加一个属性,这个属性指向我们函数本身,然后通过对象调用这个函数,完成 this 指向的改变。 最后只需要删除这个属性。

# 代码实现:

    function myCall(...args) {
        if(thisArgs == null) return this()
        thisArgs.handler = this;
        let ret = thisArgs.handler(...args)
        delete thisArgs.handler;
        return ret
    }

    Function.prototype.myCall = myCall;