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

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主要用在传输,存储,表示二进制领域,不能算的上加密,只是无法直接看到明文
    base64编码图片 优点
  • 减少http请求
  • 可对数据简单加密
  • 没有跨域问题,无需考虑图片缓存
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
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容