美文网首页
Base64编码&&模拟实现js的bind方法

Base64编码&&模拟实现js的bind方法

作者: lmmy123 | 来源:发表于2018-11-22 22:44 被阅读19次
    Q:Base64是一种基于64个可打印字符来表示二进制数据的一种方法

    因为网络上传输的字符不全是可打印字符,比如二进制文件,图片等,Base64就是为了解决此问题
    Base64在URL,Cookie,网页传输二进制文件中等到应用
    字符有 A-Z,a-z,0-9,+,/共64个可打印字符
    4个Base64(3bit)字符串可以表示3个标准的ascll字符(8bit)
    不足三个字符的话,直接最后添加"=","=="填充符
    转换步骤

    • 将转换的字符串每三个字节分为一组,每个字节占8bit,共有24个二进制位
    • 将上面的24个二进制位每6个一组,分四组
    • 在每组前面添加两个0,6个bit变为8个bit,共4个字节
    • 根据Base64编码表获得对应的值
      Base64主要用在传输,存储,表示二进制领域,不能算的上加密,只是无法直接看到明文
    Q:能否模拟实现JS的bind方法

    1.bind是Function原型链中的一个方法,修改this的执行,绑定第一个参数,返回值是一个新的函数
    2.bind返回的函数可以通过new 调用,这时提供的this指向new生成的全新对象

    var obj = {
      name: 'mingge'
    }
    function fn(a,b){
      console.log(this.name)
      console.log(a+b)
    }
    var bindfn = fn.bind(obj,3)
    bindfn(5) // 'mingge'  8
    

    // 实现代码

    Function.prototype.bind = Function.prototype.bind || function(targetObj){
      if(typeof this !== 'function'){throw new TypeError('must be function')}
      var self = this
      var args = [].slice.call(arguments,1)
      // 返回一个新的函数
      // 实现 bound 可以使用new 调用
      var bound =  function(){
        var newArgs = [].slice.call(arguments)
        var finalArgs = args.concat(newArgs)
        if(this instanceof bound){
            if(self.prototype){
              bound.prototype = Object.create(self.prototype)
            }
            // 如果返回的不是引用类型的值,就返回this
            // 生成的新对象会绑定到函数调用的this上
            var result = self.apply(this, finalArgs)
            var isObject = typeof result === 'object' && result !== null
            var isFunction = typeof result === 'function'
            if(isObject || ifFunction) {return result}
            return this       
        }
       
        return self.apply(targetObj, finalArgs )
      }
      return bound
    }
    
    
    Q:能否模拟实现JS的new操作符

    new 做了什么

    • 创建一个全新的对象
    • 这个对象会被执行[[prototype]]链接,指向原型对象
    • 生成的新对象会绑定到构造函数内部的this
    • 通过new 创建的每个对象将最终被[[prototype]]链接到这个函数的prototype对象上
    • 如果函数没有返回对象类型object,那么new表达式中的函数调用会自动返回这个新的对象
    /**
    *模拟实现new操作符
    *@param {Function} ctor [构造函数]
    *@return{引用类型}*/
    function new(ctor) {
     if(typeof ctor !== 'function'){
       throw new Error('must be a function')
     }
     // 实现ES6 new.target 的指向构造函数
     new.target = ctor
     //1.创建一个新对象
     //2.并且执行[[prototype]]链接
     //4.通过new创建的每个对象将最终被[[prototype]]链接到这个函数的原型对象上
     var newObj = Object.create(ctor.prototype)
     var args = [].slice.call(arguments,1)//去掉ctor的全部参数
     // 3.将生成的新对象实例会绑定到构造函数内部的this
     // 并获取到返回结果
     var result = ctor.apply(newObj, args)
     var isObject = typeof result === 'object' && result !== null
     var isFunction = typeof result === 'function'
     if(isObject || isFunction){
         return result
     }
     return newObj
    }
    
    

    相关文章

      网友评论

          本文标题:Base64编码&&模拟实现js的bind方法

          本文链接:https://www.haomeiwen.com/subject/cnikqqtx.html