call和apply自定义实现

本文需要读者熟悉call和apply的基本使用以及this的指向相关知识
首先来看一段代码

    
输出结果

接着思考下面的代码

    

这段js代码中后面三行(script标签以上)模拟了show.call(obj)的功能,先在obj上定义一个属性,属性值是show函数,熟悉this指向的同学就会明白此时执行obj.show()的话show方法是obj对象上的一个方法,那么此时show方法内部的this指向的就是obj。最后将obj中的show属性用delete移除。

以此为基础

    

上述的方法可以实现call中改变this的功能,但是用过call的读者应该发现,call方法不只能接受一个参数。
接着实现完整的call方法
具体实现需要具备arguments和展开运算符相关知识

    

最后实现apply
知道了怎么实现call,实现apply就非常容易了

        Function.prototype.newApply = function(ctx,argsArr){
            ctx.fn = this || window
            if(!argsArr) {
                var result = ctx.fn()
            } else {
                var result = ctx.fn(...argsArr)
            }
            delete ctx.fn
            return result
        }

总结:要学会自定义call和apply,最关键的还是熟悉js中this的指向问题

你可能感兴趣的:(call和apply自定义实现)