命名为bindX、callX、applyX
bind
Function.prototype.bindX = function() {
let self = this
let [thisArg, ...args] = arguments
return function() {
self.apply(thisArg, [...args, ...arguments])
}
}
call
Function.prototype.callX = function () {
let [thisArg, ...args] = arguments
let fn = Symbol()
thisArg[fn] = this
let result = thisArg[fn](...args)
delete thisArg[fn]
return result
}
apply
Function.prototype.applyX = function () {
let [thisArg, args] = arguments
let fn = Symbol()
thisArg[fn] = this
let result = thisArg[fn](...args)
delete thisArg[fn]
return result
}
说它多有用吧,真的没多大意义,仅仅是个人拿来玩的,退一万步讲,即便在某种情况下没有原生的bind,call,appay的支持,项目中也会用别人已经写好的。
如果硬要说些什么,那应该是js真的越来越好用了,要善加利用(⊙o⊙)哦
个人的一些感悟
- 保存当前对象this
- 保存绑定对象thisArg
- 保存剩余参数
- 根据具体功能处理
- bind 返回的是函数
- call 返回的是函数执行的结果,剩余参数是展开形式
- apply 返回的是函数执行的结果,剩余参数是数组形式
您可以查看MDN上比较权威的实现
命名为bindX、callX、applyX
bind
call
apply
说它多有用吧,真的没多大意义,仅仅是个人拿来玩的,退一万步讲,即便在某种情况下没有原生的bind,call,appay的支持,项目中也会用别人已经写好的。
如果硬要说些什么,那应该是js真的越来越好用了,要善加利用(⊙o⊙)哦
个人的一些感悟
您可以查看MDN上比较权威的实现