手写call/apply/bind

//手写call
Function.prototype.myCall = function (context) {
    let ctx = context;
    ctx.fn = this;
    const args = Array.from(arguments).splice(1);
    let result = args.length > 0 ? ctx.fn(...args) : ctx.fn()
    Reflect.deleteProperty(ctx, 'fn');
    return result;
}
//手写apply
Function.prototype.myAplly = function (context) {
    let ctx = context;
    ctx.fn = this;
    let result = arguments ? ctx.fn(...arguments[1]) : ctx.fn()
    Reflect.deleteProperty(ctx, 'fn');
    return result;
}
//手写bind
Function.prototype.myBind = function (context) {
    let ctx = context;
    ctx.fn = this;
    const arg = Array.from(arguments).splice(1);
    return function () {
        const args = arg.concat(Array.from(arguments));
        const result = args.length > 0 ? ctx.fn(...args) : ctx.fn();
        Reflect.deleteProperty(ctx, 'fn');
        return result;
    }
}
let obj = {
    a: 1,
    b: 2
}
function fn(b) {
    console.log(this.a, b)
}
fn.myCall(obj, 12)

  

原文地址:https://www.cnblogs.com/uimeigui/p/14434716.html