zoukankan      html  css  js  c++  java
  • 重写apply, call, bind方法

    重写apply, call, bind方法

    //原生JavaScript封装apply方法,第四版
    Function.prototype.applyFour = function(context) {
        var context = context || window
        var args = arguments[1] //获取传入的数组参数
        var fn = Symbol()
        context[fn] = this //假想context对象预先不存在名为fn的属性
        if (args == void 0) { //没有传入参数直接执行
            return context[fn]()
        }
        var fnStr = 'context[fn]('
        for (var i = 0; i < args.length; i++) {
            //得到"context.fn(arg1,arg2,arg3...)"这个字符串在,最后用eval执行
            fnStr += i == args.length - 1 ? args[i] : args[i] + ','
        }
        fnStr += ')'
        var returnValue = eval(fnStr) //还是eval强大
        delete context[fn] //执行完毕之后删除这个属性
        return returnValue
    }
    ES6 JavaScript封装apply方法
    //简单模拟Symbol属性
    function jawilSymbol(obj) {
        var unique_proper = "00" + Math.random();
        if (obj.hasOwnProperty(unique_proper)) {
            arguments.callee(obj)//如果obj已经有了这个属性,递归调用,直到没有这个属性
        } else {
            return unique_proper;
        }
    }
    //原生JavaScript封装apply方法
    Function.prototype.applyFive = function(context) {
        var context = context || window
        var args = arguments[1] //获取传入的数组参数
        var fn = jawilSymbol(context);
        context[fn] = this //假想context对象预先不存在名为fn的属性
        if (args == void 0) { //没有传入参数直接执行
            return context[fn]()
        }
        var fnStr = 'context[fn]('
        for (var i = 0; i < args.length; i++) {
            //得到"context.fn(arg1,arg2,arg3...)"这个字符串在,最后用eval执行
            fnStr += i == args.length - 1 ? args[i] : args[i] + ','
        }
        fnStr += ')'
        var returnValue = eval(fnStr) //还是eval强大
        delete context[fn] //执行完毕之后删除这个属性
        return returnValue
    }
    原生JavaScript封装apply方法

     https://juejin.im/post/5ce4b0c6e51d455d6d535770

  • 相关阅读:
    Linux的学习--系统目录
    PHP内核的学习--创建PHP扩展
    PHP的学习--连接MySQL的三种方式
    MIME Type
    颜色的命名
    JavaScript的学习--生成二维码
    MySQL的学习--触发器
    Google Guava之--cache
    java代码调用oracle存储过程
    oracle序列
  • 原文地址:https://www.cnblogs.com/lianchenxi/p/10240079.html
Copyright © 2011-2022 走看看