javascript手写apply及思路

92 阅读1分钟

废话不多说,一行代码一行思路注释

// apply方法是普通函数的方法,所以会写在函数的原型链上
// 参数:第一个参数是对象,第二个参数是以数组的方式进行传参
Function.prototype.myApply = function(obj,arg = []){
    // 首先判断传进来的第一个参数是否为对象
    const obj  = obj?Object(obj):window
    //给对象创建一个函数,且是唯一识别
    const fn = Symbol(obj)
    //借用刚刚创建的函数指向this
    obj[fn] = this
    //获取所有参数
    const res = obj[fn](...arg)
    //删除fn 删除原因,对象本身并没有这个函数
    delete fn
    //返回所传参数结果
    return res
}

-----------------------------------------------------------------------------------

//使用方法
let obj = {
    name = 'jack'
}
function fn1(a,b){
    console.log(this.name,a,b)
}
fn1.apply(obj,['好看',18])
fn1.myApply(obj,['好看',18])