🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[toc] #### 1.手写call call用法: ```js let obj = { name: "xuxu1", }; function getName() { console.log(this.name); } getName.call(obj); // xuxu ``` 手写call思路: 1.传入一个对象,这个作为新this的指向 2.将调用的方法也就是老的this指向这个对象 3.执行调用的方法 ```js Function.prototype.mCall = function(obj, ...args) { // 绑定 this 到新的对象上 const newObj = obj || window const key = Symbol() // 定义一个唯一 key newObj[key] = this // 执行,传递后面的参数,并返回结果 const res = newObj[key](...args) // 删除给源对象绑定的 key delete newObj[key] return res } ``` #### 2.手写apply,apply接受的参数是数组 ```js Function.prototype._apply = function(context, args) { const newObj = context || window let key = Symbol() newObj[key] = this // 把方法赋值给 context,作为一个属性值 newObj[key](args) console.log(args) delete newObj[key] } ``` #### 3.手写 bind ```js Function.prototype.myBind = function(context, ...args) { // 获取当前方法 const self = this // 返回一个新函数,将 this指向绑定到 context const fn = function(...rest) { return self.call(context, ...args, ...rest) } // 如果原方法上存在原型,添加原型到新的方法上 if (self.prototype) { fn.prototype = Object.create(self.prototype) } return fn } ```