call、apply、bind 是通过传递形参来改变原来函数的this和其他参数
var a = '张三'
var stu = function Student(a){
console.log(this.a,a)
}
Function.prototype.call1 = function(){
// 首先获取参数列表
var args =Object.values(arguments)
// 获取传递进来的this
var t = args.shift()
t.__proto__._fn = this
var res = t._fn(...args)
return res
}
Function.prototype.apply1 = function(){
// 首先获取参数列表
var args =Object.values(arguments)
// 获取传递进来的this
var t = args.shift()
if(args.length>0){
throw new Error('参数不正确')
}
t.__proto__._fn = this
var res = t._fn()
return res
}
Function.prototype.bind1 = function(){
// 首先获取参数列表
var args = Object.values(arguments)
// 获取传递进来的this
var t = args.shift()
// 获取本函数的this
var self = this;
t.__proto__._fn = this
return function(){
return t._fn(...args)
}
}
stu()
stu.call1({a:123},23)
stu.apply1({a:'123'})
stu.bind1({a:'666'},123)()
运行结果: