js 实现 bind 的这五层,你在第几层?

 

  这一层非常的简单,得益于 JS 原型链的特性。由于 function xxx 的原型链 指向的是 Function.prototype , 因此我们在调用 xxx.bind 的时候,调用的是 Function.prototype 上的方法。

  Function.prototype._bind = function() {}

  这样,我们就可以在一个构造函数上直接调用我们的bind方法啦~例如像这样。

  funciton myfun(){}

  myfun._bind();

  想要详细理解这方面的可以看这张图和这篇文章(https://github.com/mqyqingfeng/blog/issues/2)

  

js-prototype

 

  第二层 - 改变 this 的指向

  这可以说是 bind 最核心的特性了,就是改变 this 的指向,并且返回一个函数。而改变 this , 我们可以通过已知的 apply 和 call 来实现,这里我们就暂且使用 apply 来进行模拟。首先通过 self 来保存当前 this,也就是传入的函数。因为我们知道 this 具有 隐式绑定的规则(摘自 《你不知道的JavaScript(上)》2.2.2 )优品拍怕

  function foo() {console.log(this.a)}

  var obj = {a: 2, foo};

  obj.foo(); // 2

  通过以上特性,我们就可以来写我们的 _bind 函数。

  Function.prototype._bind = function(thisObj) {

  const self = this;

  return function () {

  self.apply(thisObj);

  }

  }

  var obj = {a:1}

  function myname() {console.log(this.a)}

  myname._bind(obj)(); // 1

  可能很多朋友都止步于此了,因为在一般的面试中,特别是一些校招面试中,可能你只需要知道前面两个就差不多了。但是想要在面试中惊艳所有人,仍然是不够的,接下来我们继续我们的探索与研究。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值