Function.prototype.myApply = function (context) {
if (typeof this !== 'function') {
throw new TypeError('error')
}
let result = null;
context = context || window;
context.fn = this;
if (arguments[1]) {
result = context.fn(...arguments[1]);
} else {
result = context.fn();
}
delete context.fn;
return result;
}
Function.prototype.myCall = function (context) {
// 判断调用对象是否为函数, this表示调用的函数consoleStr
if (typeof this !== 'function') {
throw new TypeError('error');
}
let args = [...arguments].slice(1), result = null;
//判断context是否传入,没有传入,则设置为window
context = context || window;
// 将调用函数设置为对象的方法
context.fn = this;
// 调用函数
result = context.fn(...args);
// 删除属性
delete context.fn;
return result;
}
const consoleStr = function (val) {
console.log(val);
}
// consoleStr.myCall(this, 2);
Function.prototype.myBind = function (context) {
// 判断调用对象是否为函数
if (typeof this !== "function") {
throw new TypeError("Error");
}
// 获取参数
var args = [...arguments].slice(1),
fn = this;
return function Fn() {
/* 根据调用方式,传入不同绑定值
判断函数作为构造函数的情况,这个时候需要传入当前函数的 this 给 apply 调用,
其余情况都传入指定的上下文对象。
*/
return fn.apply(
this instanceof Fn ? this : context,
args.concat(...arguments)
);
};
};
apply,call,bind的实现
最新推荐文章于 2024-07-31 16:33:32 发布