废话不多说,一行代码一行思路注释
// 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])