JSはappyとcallを実現します

1054 ワード

基本的な考え方としては、関数を一時的に借りて、実行後すぐに削除します.パラメータの処理が必要です.
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などがあります.