<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>call&apply&bind</title>
</head>
<body>
<script>
// 将方法挂载到对象上
// 执行对象的方法
// 将这个方法从对象上移除
Function.prototype.myCall = function (context, ...args) {
let fn = Symbol(1);
context[fn] = this;
context[fn](...args);
Reflect.deleteProperty(context, 'fn');
};
Function.prototype.myApply = function (context, args = []) {
let fn = Symbol(1);
if (args && !(args instanceof Array)) {
throw 'error';
}
context[fn] = this;
context[fn](...args);
Reflect.deleteProperty(context, 'fn');
};
Function.prototype.myBind = function (context, ...args) {
return (...args2) => {
let fn = Symbol(1);
context[fn] = this;
context[fn](...args.concat(...args2));
Reflect.deleteProperty(context, 'fn');
};
};
</script>
</body>
</html>