基本的思路就是,把函数暂时借用一下,执行完后就立刻删除,需要注意的是对参数的处理
function Person() {
this.name = "无名"
}
Person.prototype.print = function(age, city) {
console.dir(`姓名:$ {
this.name
},年龄:$ {
age
},城市:$ {
city
}`);
}
const person = new Person();
person.print(18, "广州");
// call实现
function _call() {
let[o, ...args] = arguments;
o.fn_tmp = this; // 此时的this指向函数,因为是那个函数调用了._call
o.fn_tmp(...args);
delete o.fn_tmp; // 因为本来是不存在这个方法的,所以要删除
}
Function.prototype._call = _call;
// apply实现
function _apply(obj, arr) {
if (! (arr instanceof Array)) {
throw "参数必须为数组"
}
obj.fn_tmp = this;
obj.fn_tmp(...arr);
// 如果不用ES6,可以通过循环遍历把参数和函数拼接起来,再用eval执行。
delete obj.fn_tmp
}
Function.prototype._apply = _apply;
// 测试一下
const obj = {
name: "nh"
}
person.print._call(obj, 20, "深圳");
person.print._apply(obj, [21, "杭州"]);
console.dir(obj);
我的主页:https://blog.csdn.net/qq_29750277,有关于前端(Vue、electron...)、Python等