apply精简版源码
基本思路
- 判断函数中的第一个参数是否存在并且为对象
- 为传递过来的对象添加一个属性为当前函数的this(该属性要做一下防止命名冲突)
- 获取参数列表
- 执行对象中的函数并且传递进去参数得到一个数据
- 删除对象中之前添加的属性
- 返回数据
注意事项:apply是ES3提出的所以这里不建议写ES6语法
function randomString(){
return Math.random() + new Date().toTimeString();
}
Function.prototype._call = function(context){
if(typeof context === "object" && context !== null){
var prop = randomString()
context[prop] = this
var args = [];
for(var i=0;i<arguments[1].length;i++){
args.push(arguments[1][i])
}
var res = eval("context[prop]("+ args +")");
delete context[prop]
return res
}
}