// 手写call、apply、bind
// 实现思路
// 通过对象属性的方式调用函数,这个函数里面的this指向这个对象
// 每次调用新增 一个symbol属性,调用完删除
// 这个symbol属性就是调用mycall方法的函数
// 函数形参中使用…ary是将多个形参都放到了一个数组里,在函数内部使用arg这个变量时,就是包含所有形参的数组
// 在调用context fn时候,…arg是为了展开数组,依次传入参数调用函数
let Person = {
name: 'Tom',
say (test1,test2) {
console.log(`我叫${this.name},今年${this.age}岁,test1是${test1},test2是${test2}`)
}
}
let Person1 = {
name: ' Tom111',
age: '18'
}
Function.prototype.myCall = function (context, ...arg) {
context = context || window
const fn = Symbol('temporary')
context[fn] = this;
context[fn](...arg);
delete context[fn]
}
Function.prototype.myApply = function (context,arg) {
context = context || window
const fn = Symbol('temporary')
context[fn] = this;
context[fn](...arg);
delete context[fn]
}
Function.prototype.myBind = function (context,...arg) {
const _this = this;
return function () {
return _this.myCall(context, ...arg)
}
}
Person.say.myCall(Person1, 'test1Content', 'test2Content')
Person.say.myApply(Person1,['test1Content', 'test2Content'])
Person.say.myBind(Person1,'test1Content', 'test2Content')()
手写call、apply、bind
最新推荐文章于 2024-06-09 22:26:02 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)