直接上代码,一行代码一行注释解释
// 首先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