apply,call,bind方法简单实现

apply方法:在传入的this对象中创建函数,以实现在this环境中执行函数的功能。

let func1 = {
    name: 'test'
}
let func2 = function (a, b, c) {
    return a + b + c + this.name;
}

Function.prototype.myApply = function (thisArg, argArr) {
    thisArg = thisArg ? Object(thisArg) : window;
    thisArg.func = this;
    let result = thisArg.func(...argArr);
    delete thisArg.func;
    return result;
}

func2.myApply(func1, ['1', '2', '3']);       //123test

 

call方法:同上,参数传入方式不同。

let func1 = {
    name: 'test'
}
let func2 = function (a, b, c) {
    return a + b + c + this.name;
}

Function.prototype.myCall = function (thisArg, ...argArr) {
    thisArg = thisArg ? Object(thisArg) : window;
    thisArg.func = this;
    let result = thisArg.func(...argArr);
    delete thisArg.func;
    return result;
}

func2.myCall(func1, '1', '2', '3');       //123test

 

bind方法:返回的是一个函数,而不是运行结果,并且注意继承和实例问题。

let func1 = {
    name: 'test'
}
let func2 = function (a, b, c) {
    return a + b + c + this.name;
}

Function.prototype.myBind = function (thisArg, ...argArr) {
    let self = this;

    let Bound = function (...args) {
        //如果当前为bound的实例,直接使用bound的this
        let thisAgr = this instanceof Bound ? this : self;

        return self.apply(thisAgr, [...argArr, ...args]);
    }

    //为了可以找到目标函数,即func2的原型中的属性和方法,继承当前函数的原型链方法
    Bound.prototype = Object.create(self.prototype);
    Bound.prototype.constructor = self;

    return bound;
}

func2.myBind(func1, '1', '2', '3')();       //123test    

 

posted @ 2020-11-26 23:09  true!  阅读(76)  评论(0编辑  收藏  举报