-
Notifications
You must be signed in to change notification settings - Fork 0
/
模拟实现bind.js
41 lines (39 loc) · 1.26 KB
/
模拟实现bind.js
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
* bind() 方法会创建一个新函数。当这个新函数被调用时,bind() 的第一个参数将作为它运行时的 this,之后的一序列参数将会在传递的实参前传入作为它的参数。
*
* 要解决的问题:
* 1. 返回一个函数
* 2. 执行 bind 和返回函数时都可传参
* 3. 当 bind 返回的函数作为构造函数使用的时候,bind 传入的 this 会忽略,将原函数当作构造器,但参数依然有效
*/
Function.prototype.mockBind = function(context, ...args1) {
if (this === Function.prototype) {
return this;
}
const _this = this;
return function fn(...args2) {
if (this instanceof fn) {
return new _this(...args1, ...args2);
}
return _this.apply(context, args1.concat(args2));
};
};
// 向下兼容
Function.prototype.mockBind = function(context) {
if (this === Function.prototype) {
return this;
}
var _this = this;
var args1 = Array.prototype.slice.call(arguments, 1);
var fBound = function() {
var args2 = Array.prototype.slice.call(arguments);
return _this.apply(
this instanceof fNOP ? this : context,
args1.concat(args2)
);
};
var fNOP = function() {};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
};