Function.prototype.apply = function (...arg) {
let context = arg[0]
// 因为apply的传参为一个数组,所以...arg接收参数后,arg格式为[context, [params]]
let args = arg[1]
if(Object.prototype.toString.call(args) !== "[object Array]") {
console.error('参数应该为一个数组')
return
}
//判断this指向的是否为对象,不是则让他为window或指向一个空对象
if(typeof context === 'object') {
context = context || window
}else {
context = Object.create(null)
}
//创建一个不会重复键名
let fn = new Date().getTime() + '' + Math.random()
//键名的值为this这个函数
context[fn] = this
//直接执行函数,此时this指向context
let result = context[fn](...args)
delete context[fn]
return result
}
function aa(a,b) {
console.log(this.x,a,b);
}
let obj = {x: 100}
aa.apply(obj, [10,100]) // 100,10,100
网友评论