js实现call,apply,bind函数功能

1,650 阅读1分钟

call函数实现

Function.prototype.ltCall = function(thisArg, ...arr) {
        var result = undefined;
        var fn = this;
        //判断传递的thisArg是否为null或undefind
        thisArg = thisArg ? Object(thisArg) : window;
        //定义一个symbol变量,防止thisArg上有相同属性名
        var symbol = Symbol();
        //给thisArg添加一个symbol属性
        thisArg[symbol] = fn;
        //判断arr是否为空
        arr = arr ? arr : [];
        //获取对象上的symbol属性
        var symbols = Object.getOwnPropertySymbols(thisArg);
        for (key of symbols) {
            //通过隐式调用将this指向thisArg
            result = thisArg[key](...arr);
            //函数调用完,删除fn属性
            delete thisArg[key];
        }
        return result;
    };

apply函数实现

Function.prototype.ltapply = function(thisArg, arr) {
        var result = undefined;
        var fn = this;
        thisArg = thisArg ? Object(thisArg) : window;
        thisArg.fn = fn;
        //定义一个symbol变量,防止thisArg上有相同属性名
        var symbol = Symbol();
        //给thisArg添加一个symbol属性
        thisArg[symbol] = fn;
        //判断arr是否为空
        arr = arr ? arr : [];
        //获取对象上的symbol属性
        var symbols = Object.getOwnPropertySymbols(thisArg);
        for (key of symbols) {
            //通过隐式调用将this指向thisArg
            result = thisArg[key](...arr);
            //函数调用完,删除fn属性
            delete thisArg[key];
        }
        return result;
    };

bind函数实现

Function.prototype.ltbind = function(thisArg, ...arr) {
        var fn = this;
        thisArg = thisArg ? Object(thisArg) : window;
        //定义一个symbol变量,防止thisArg上有相同属性名
        var symbol = Symbol();
        //给thisArg添加一个symbol属性
        thisArg[symbol] = fn;
        arr = arr ? arr : [];

        function proxyFn() {
            var result = undefined;
            //获取到thisArg上的所有symbol属性
            var symbols = Object.getOwnPropertySymbols(thisArg);
            for (key of symbols) {
                //通过隐式调用将this指向thisArg
                result = thisArg[key](...arr);
                //函数调用完,删除fn属性
                delete thisArg[key];
                return result;
            }
        }
        return proxyFn;
    };