简单的 call apply bind 实现

89 阅读1分钟

仅仅学习一下思路,其实并不是很完美,如果更完美的话,可能需要考虑new的时候的this指向问题, 这里仅仅就提供一下思路,大佬勿喷~

call实现

Function.prototype.myCall = function(context, ...args) {
  context = context || window
  const key = Symbol() // 为了防止key被覆盖

  context[key] = this // 利用 . 改变this

  const res = context[key](...args)

  delete context[key]

  return res
}

apply实现

  • 其实和call方法是一样的,只不过就是在传参的时候
  • call 是 a,b,c...这样的结构 apply 是数组
  • 执行的时候 ...args 结构即可 这里多提一句,call的性能比apply要好,因为apply可能会做一些参数校验之类的东西

bind实现

Function.prototype.myBind = function(that, ...arg) {
    const _this = this
    return function(...params) { 
        _this.apply(that || window, arg.concat(params))
    }
}

是不是很简单 ,其实思路就是这样的,,,,