手写call,apply,bind
程序员文章站
2022-03-08 09:43:21
...
为了更好的理解call,apply,bind,研究了一下怎么手写这些方法
1.手写call
Function.prototype.Call = function (content = window) {
content.fn = this; //this指向调用它的对象 即bar方法
let args = [...arguments].slice(1);//取得参数列表
let result = content.fn(...args);
return result;
};
let person = {
name: '张三'
};
function fn(sex, age) {
console.log(this.name + sex + age);
}
fn.Call(person, '男', '18岁') // 张三男18岁
2.手写apply
Function.prototype.Apply = function (content = window) {
content.fn = this;
let result;
// 判断是否有第二个参数
if(arguments[1]) {
result = content.fn(...arguments[1])
} else {
result = content.fn()
}
return result
};
3.手写apply
Function.prototype.Bind = function (content) {
if (typeof this != 'function') {
throw Error('not a function')
}
// 若没问参数类型则从这开始写
let fn = this;
let args = [...arguments].slice(1);
console.log(arguments);
console.log(...arguments);
let resFn = function () {
return fn.apply(this instanceof resFn ? this : content, args.concat(...arguments))
};
return resFn;
};
this.value = 2;
let foo = {
value: 1
};
let bar = function(name, age, school) {
console.log(name); // 'An'
console.log(age); // 22
console.log(school) // '家里蹲大学'
};
let result = bar.Bind(foo, 'An'); //预置了部分参数'An'
result(22, '家里蹲大学') //这个参数会和预置的参数合并到一起放入bar中
上一篇: Ubuntu创建新用户并增加管理员权限