问答

在实现bind函数时,源码中的instanceof起到什么作用?

作者:admin 2021-04-30 我要评论

在学习bind的实现方法时,对于源码的instanceof一直百思不得其解。只知道是和new 关键字有关联。 是使用了new之后 原型指向就改变了吗? Function.prototype.myBi...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

在学习bind的实现方法时,对于源码的instanceof一直百思不得其解。只知道是和new 关键字有关联。
是使用了new之后 原型指向就改变了吗?

Function.prototype.myBind = function(ctx, ...args) {
  const _this = this
  const o = function() {}
  const fn = function(...payload) {
    const p = [...args, ...payload]
    if(this instanceof o) {
      _this.myApply(this, p)
    }else {
      _this.myApply(ctx, p)
    }
  }
  console.log(_this, _this.prototype)
  o.prototype = _this.prototype
  fn.prototype = new o
  return fn
}

function person() {
 console.log(this)
} 
person.prototype.getName = function() {}
const obj = {
  name: 'jack'
}
const p = person.myBind(obj2)
const pp = new p()

上面p函数如果直接调用 bind里的fn内部this就指向window
但是如果用new实例化,bind里的fn内部的this就指向了 fn
这一点我一直弄不明白。请教大神指点一下

###
上面p函数如果直接调用 bind里的fn内部this就指向window
但是如果用new实例化,bind里的fn内部的this就指向了 fn

如果 new p() fn 内部的 this 怎么会指向 fn 呢?指向的不应该是 fn 的实例?你可以去先了解一下 new 的原理。

这个代码中函数 o 就是用来隔离返回的函数 fn 和原函数的直接继承关系,instanceof 其实就是检测返回的 fn 是否以 new 调用。

###

个人感觉理解有几点误区:

  1. 上面p函数如果直接调用 bind里的fn内部this就指向window

    此时函数_this内部的this变量指向的是ctx

  2. 但是如果用new实例化,bind里的fn内部的this就指向了 fn

    此时函数_this内部的this变量指向的是函数fnthis

可以看下这个,里面有关于bind函数的实现解析。

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 从github上clone代码后文件不显示绿勾

    从github上clone代码后文件不显示绿勾

  • 父组件中循环子组件,子组件$emit触发A

    父组件中循环子组件,子组件$emit触发A

  • 在实现bind函数时,源码中的instanceof

    在实现bind函数时,源码中的instanceof

  • go group并发执行

    go group并发执行

腾讯云代理商
海外云服务器