# 解题思路 or 实现原理

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

特点:

  • 改变 this 指向

  • 返回一个函数

  • 可以传入参数

提示

Note:

  • new 的优先级大于 bind, 如果 bind 绑定后的函数被 new了, this 会指向当前函数的实例

  • 需要保留 原函数的原型链 上的属性和方法

# 实现代码

/*
 * @Author: Rainy
 * @Date: 2020-04-09 19:02:51
 * @LastEditors: Rainy
 * @LastEditTime: 2020-04-09 19:33:41
 */

import { ObjectMap } from 'types';

// @ts-ignore
Function.prototype._bind = function(context: ObjectMap<any>, ...args: any): any {
  /* istanbul ignore next */
  if (typeof this !== 'function') {
    throw new TypeError('Bind must be called with a function');
  }

  const _context = this;
  
  const fb = function() {
    // @ts-ignore
    _context.apply(this instanceof fb ? this : context, args.concat(Array.prototype.slice.call(arguments)));
  };

  fb.prototype = Object.create(_context.prototype);

  return fb;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# 参考

bind (opens new window)