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) { |