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)
不足三个字符的话,直接最后添加"=","=="填充符
转换步骤
- 将转换的字符串每三个字节分为一组,每个字节占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
}