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

2018-11-22  本文已影响19人  lmmy123
Q:Base64是一种基于64个可打印字符来表示二进制数据的一种方法

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

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 做了什么

/**
*模拟实现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
}

上一篇下一篇

猜你喜欢

热点阅读