手写Bind函数

原生bind函数,创建一个新函数,新函数的this指向bind的第一个参数,剩下的参数作为实参传入目标函数中。同时,需要知道的是,新函数可以当做构造函数使用

    function func(...arg) {
      console.log(this)
      console.log(arg)
    }

    func.prototype.getName = function () {
      console.log(this.name)
    }

    var obj = { name: 'test' }

    var fn1 = func.bind(obj, 1, 2, 3) // 原生bind

    fn1() // {name: 'test'}  [1,2,3]

    var f1 = new fn1()

    console.log(f1) // func () { _proto_:getName:f() constructor:f func(...arg) }

下面我们写自己的bind函数,需要将该函数绑定到Function的原型上

    Function.prototype.myBind = function (thisArg, ...arg) {
      let self = this
      return function () {
        self.apply(thisArg, [...arg])
      }
    }

    function func(...arg) {
      console.log(this)
      console.log(arg)
    }

    func.prototype.getName = function () {
      console.log(this.name)
    }

    var obj = { name: 'test' }

    var fn1 = func.bind(obj, 1, 2, 3) // 原生bind

    fn1() // {name: 'test'}  [1,2,3]

    var f1 = new fn1()

    console.log(f1) // func () { _proto_:getName:f() constructor:f func(...arg) }

    var fn2 = func.myBind(obj, 1, 2, 3) // 自定义myBind

    fn2() // {name: 'test'}  [1,2,3]

由此,我们自定义myBind函数实现了bind函数的基本功能,创建一个新函数,新函数的this指向myBind的第一个参数,剩下的参数作为实参传入目标函数。

但是,此时的myBind函数创建的新函数并不能当做构造函数使用,为了解决此问题,我们需要将myBind函数中的prototype指向目标函数的prototype,constructor也需要指向目标函数

    Function.prototype.myBind = function (thisArg, ...arg) {
      let self = this
      let bound = function (...list) {
        self.apply(thisArg, [...arg, ...list])
      }
      bound.prototype = Object.create(self.prototype)
      bound.prototype.constructor = self
      return bound
    }

    function func(...arg) {
      console.log(this)
      console.log(arg)
    }

    func.prototype.getName = function () {
      console.log('222')
    }

    var obj = { name: 'test' }

    var fn2 = func.myBind(obj, 1, 2, 3) // 自定义myBind

    fn2() // {name: 'test'}  [1,2,3]

    var f2 = new fn2()

    f2.getName() // 222

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值