如何模拟实现一个bind

193 阅读1分钟

如何模拟实现一个bind

bind()函数创建一个新的函数,在bind()被调用时,新函数的this被指定为bind的第一个参数,其他参数将作为新函数的参数使用。

bind做了哪些事?

对于普通函数改变this指向
对于构造函数要获取其原型上的属性和方法

bind 应用

创建绑定函数

var x = 10
var model = {
  x: 100,
  getX: function () {
    console.log(this.x)
    return this.x
  }
}
model.getX()// 100

var getX = model.getX
getX() // 10 此时this执行window

var newGetX = getX.bind(model)
newGetX() // 100

函数的快捷使用

var unboundSlice = Array.prototype.slice
var slice = Function.prototype.apply.bind(unboundSlice)
function aa(1,2,3) {
  console.log(arguments)
  slice(arguments)
}

bind 实现

Function.prototype.bind = function(conext, ...args) {
  var self = this
  var fNOP = function () {}
  // 高阶函数返回一个函数
  var fbound = function() {
    // 执行的时候改变this的指向
    self.apply(this instanceof self ? this : context,
      args.concat(Array.prototype.slice.call(arguments)))
  }

  fNOP.prototype = this.prototype
  fbounf.prototype = new fNOP()

  return fbound
}