实现bind之前,我们首先要知道它做了哪些事情。

  1. 对于普通函数,绑定this指向
  2. 对于构造函数,要保证原函数的原型对象上的属性不能丢失
  1. Function.prototype.mybind = function (context, ...args) {
  2. if (typeof this !== 'function') {
  3. throw new Error(
  4. 'Function.prototype.bind - what is trying to be bound is not callable'
  5. )
  6. }
  7. let self = this
  8. let FB = function () {
  9. self.apply(
  10. //当为普通函数的时候 this 指向window,self指向绑定函数 为 false,this为绑定的实例对象
  11. //当为构造函数的时候 this 指向实例,self指向绑定函数 为 true,this为new出来的实例对象
  12. this instanceof self ? this : context,
  13. args.concat(Array.prototype.slice.call(arguments))
  14. )
  15. }
  16. FB.prototype = Object.create(this.prototype)
  17. return FB
  18. }

参考文章

JavaScript深入之bind的模拟实现