实现call、apply、bind

1. call 函数的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Function.prototype.myCall = function (target, ...arg) {
// 如果是null或者undfined 则指向window 不是对象类型则转化为包装类
target = target === null || target === undefined ? window : Object(target);

Reflect.defineProperty(target, "fn", {
configurable: true,
writable: false,
enumerable: false,
value: this,
});

// 隐式绑定
target.fn(...arg);

// 删除fn
Reflect.deleteProperty(target, "fn");
};

2. apply 函数的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Function.prototype.myApply = function (target, arg) {
// 如果是null或者undfined 则指向window 不是对象类型则转化为包装类
target = target === null || target === undefined ? window : Object(target);

Reflect.defineProperty(target, "fn", {
configurable: true,
writable: false,
enumerable: false,
value: this,
});

// 隐式绑定
target.fn(...arg);

// 删除fn
Reflect.deleteProperty(target, "fn");
};

3. bind 函数的实现

1
2
3
4
5
6
7
8
9
10
11
Function.prototype.myBind = function (target, ...arg) {
// 如果是null或者undfined 则指向window 不是对象类型则转化为包装类
target = target === null || target === undefined ? window : Object(target)

target.fn = this

return (...rest) => {
target.fn(...arg, ...rest)
}
}