js手写call及思路

56 阅读1分钟

直接上代码,一行代码一行注释解释


// 首先call()方法是普通函数的方法,所以要写在函数的原型链上
// 值得注意的是,call()方法有多个参数,所以第二个参数用扩展符进行传参
Function.prototype.myCall = function(obj,...args){
    //首先我们要判断第一个参数是不是Object类型
    const obj = obj?Object(obj):window;
    // 要创建一个对象的唯一值
    const fn = Symbol(obj)
    // 将this指向对象
    obj[fn] = this
    //获取this及其余参数
    const res = obj[fn](...args)
    //删除fn
    delete obj[fn]
    // 返回res
    return res 
}

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

//如何使用
var obj1 = {
    name:'rose'
}
function fn1(a,b){
    console.log(this.name,a,b)
}

fn.call(obj1,12,14)  // rose,12,14
fn.myCall(obj1,12,14)// rose,12,14