bind 函数我们经常用到,主要用于换绑 this。其返回值是一个方法。此外我们还可以把一些参数固定下来,相当于封装了一个简易函数。
换绑 this:
1  | const obj = {  | 
减少参数:
1  | const obj = {  | 
不过如果 bind 返回的方法用作构造函数的话,绑定 this 动作就失效了,且会返回原方法构造出的新对象。
用作构造函数:
1  | const obj = {  | 
基于这些特性我们自己模拟实现一个 bind 方法:
1  | Function.prototype.bindFn = function bind(thisArg) {  | 
函数的.name和.length属性
此外函数还有一些默认行为,比如.name打印函数名和.length打印形参个数。如果是 bind 函数返回的话,会在前面加个bound
1  | console.log(Function.prototype.bind.name); // bind  | 
我们构建的 bind 在这个方面依旧跟原生 bind 的表现不一样:
1  | Function.prototype.bindFn = function bind(thisArg) {  | 
函数的.name和.length属性是无法修改的:
1  | var aa = function () {};  | 
原因是writable: false,但可以自己配置:
1  | var a = () => {};  | 
new.target的用处
如果用this instanceof bound来替代new.target === bound会有如下问题:
1  | function Student(name) {  | 
可见并非是实例就可以,而必须是用 new 调用才是构造函数
最终版本
1  | Function.prototype.bindFn = function bind(thisArg) {  |