ES5实现ES6的api

2019-04-02  本文已影响0人  Mr无愧于心

1.let

for(let i=0;i<a;i++){
  setTimeout(()=>{
    console.log(i)
  },1000)
}
//转
for(var i=0;i<a;i++){
  (function(){
    setTimeout(()=>{
      console.log(i)
    },1000)
  })()
}

2.解构赋值

let arr=[1,2,3]l;
let [a,b,c]=arr;
//转
let a=arr[0];
let b=arr[1];
let c=arr[2];

let obj={name:'aa',age:10}
let {name,age}=obj;
//转
let name=obj.name;
let age=obj.age;

3.模板字符串

let name='帅哥';
let tempStr=`haha 我是${name}`
//转
function replace(tempStr){
  return tempStr.replace(/\$\{([^}]+)\}/g,function(){
    return eval(arguments[1])
  })
}

//原理
function desc(strings,...values){
  let result='';
 console.log(strings)
  console.log(values)
  for(let i=0;i<values.length;i++){
    result+=strings[i]+values[i];
  }
  result+=strings[strings.length-1];
  return result;
}

desc`我是${name}今年${age}`

4.默认参数

function ajax(url=new Error('url不能为空'),method='get',dataType='json'){
    console.log(url,method)
}
ajax();
//转
function ajax(url=new Error('url不能为空'),method='get',dataType='json'){
    var url = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Error('url不能为空');
    var method = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'get';
    var dataType = arguments.length > 2 && arguments[2] !== undefined ? arguments
}

5.剩余运算符

function ajax(url,...res){
    console.log(res)
}
ajax('aa','bb','cc')
//转
for (var _len = arguments.length, res = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
        res[_key - 1] = arguments[_key];
    }

6.展开运算符

let arr1=[1,2];
let arr2=[3,4];
let arr3[...arr1,...arr2]
//转
var arr3 = [].concat(arr1, arr2);
//----------------------------------
Math.max(...arr2)
//转
Math.max.apply(Math, arr2);
//----------------------
let obj1={name:'haha'}
let obj2={age:2}
let obj3={...obj1,...obj2}
//转
var _extends = Object.assign || function (target) { 
for (var i = 1; i < arguments.length; i++) { 
  var source = arguments[i];
   for (var key in source) { 
      if (Object.prototype.hasOwnProperty.call(source, key)) { 
        target[key] = source[key];
     }
   }
 }
 return target; 
};

var obj1 = { name: 'haha' };
var obj2 = { age: 2 };
var obj3 = _extends({}, obj1, obj2);

7.箭头函数(this问题,没有自己的this,使用上层的this)

obj={
  name:'haha',
  getName(){
    let that=this
    setTimeout(()=>{
      console.log(that.name)
    },1000)
  }
}
//转
obj={
  name:'haha',
  getName(){
    let that=this
    setTimeout(function(){
      console.log(that.name)
    },1000)
  }
}

8.Object.setProtoTypeOf()

let obj1={age:1};
let obj3={};
Object.setProtoTypeOf(obj3,obj1)
//等价于
obj3.__proto__=obj1

9.super可以调用原型上的方法

let obj1={
  age:1,
  getFood(){
    return '12'
  }
}
let obj3={
  age:1,
  getFood(){
    return '34'+super.getFood()
  }
}
obj3.__proto__=obj1;
obj3.getFood()

10.class

class Parent{
  constructor(name){
    this.name=name//实例的私有属性
  }
  getName(){//实例的公有属性,也就相当于原型上的属性
    console.log(this.name)
  }
  //静态属性
  static hello(a){
    console.log(a)
  }
}
let p=new Parent('haha')




var _createClass = function () { 
  //target目标  props是属性对象数组
  function defineProperties(target, props) { 
    //循环每个数组
    for (var i = 0; i < props.length; i++) { 
      //取出每个属性描述器
      var descriptor = props[i]; 
      //可枚举 for in 能循环
      descriptor.enumerable = descriptor.enumerable || false; 
      //可配置 可以用delete删除
      descriptor.configurable = true; 
      //可修改值
      if ("value" in descriptor) descriptor.writable = true; 
      //真正的项Parent类的原型上增加属性
      Object.defineProperty(target, descriptor.key, descriptor);
     } 
   }
     return function (Constructor, protoProps, staticProps) {
        //参数是构造函数 原型上的属性 静态属性(类上的属性)
        //如果有原型属性的话 ,把class的公有属性放到构造函数的原型上
       if (protoProps) defineProperties(Constructor.prototype, protoProps); 
      //如果有静态属性,就放在构造函数上(函数的对象形态)
       if (staticProps) defineProperties(Constructor, staticProps); 
       return Constructor; 
    };
 }();
//类的调用检查
function _classCallCheck(instance, Constructor) { 
  //如果这个实例不是这个构造函数的实例的话,就报错 不能把一个类当做构造函数来调用
  if (!(instance instanceof Constructor)) { 
    throw new TypeError("Cannot call a class as a function");
  }
}


var Parent = function () {
  function Parent(name) {
    _classCallCheck(this, Parent);//为了保证这个类只能new 不能当做普通函数调用
    this.name = name;
  }
  _createClass(Parent, [{
    key: 'getName',
    value: function getName() {
      console.log(this.name);
    }
  }],[{
    key: 'hello',
    value: function hello(a) {
      console.log(a);
    }
  }]));
  return Parent;
}();
var p = new Parent('haha');

10.class类的继承

//1. 公有属性继承公有属性,并重置constructor
//2. 私有继承私有
//3. 通过__proto__关联子类 与父类,使子类继承父类的静态方法
class Child extends Parent{
  constructor(name,age){
    super(name)//指的是父类的构造函数
    this.age=age;
  }
  getAge(){
    console.log(this.age)
  }
}
//
function _possibleConstructorReturn(self, call) { 
  if (!self) { 
    throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); 
  } 
  return call && (typeof call === "object" || typeof call === "function") ? call : self; 
}

function _inherits(subClass, superClass) {//子类原型 继承Object.create(父类原型),并修改constructor指向
 if (typeof superClass !== "function" && superClass !== null) { 
    throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); 
  } 
  subClass.prototype = Object.create(superClass && superClass.prototype, { 
    constructor: { 
      value: subClass, 
      enumerable: false, 
      writable: true, 
      configurable: true 
    } 
  });
   if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;//修改原型链
 }

var Child = function (_Parent) {
  _inherits(Child, _Parent);

  function Child(name, age) {
    _classCallCheck(this, Child);//检测

    //指的是父类的构造函数
    var _this = _possibleConstructorReturn(this, (Child.__proto__ || Object.getPrototypeOf(Child)).call(this, name));

    _this.age = age;
    return _this;
  }

  _createClass(Child, [{//给子类的 原型增加getAge属性
    key: 'getAge',
    value: function getAge() {
      console.log(this.age);
    }
  }]);
  return Child;
}(Parent);

11.generation、iterator生成器、迭代器

//koa的基础  async、await的基础
//生成器   用来生成迭代器的
//迭代器可以不停地调用next方法得到一个结果{value,done}
//当done为true的时候 就表示取完了
function * read(books){
  for(let i=0;i<books.length;i++){
    yield books[i];
  }  
}
let it=read(['js','node'])
let r1=it.next();
console.log(r1)
let r2=it.next();
console.log(r2)
let r3=it.next();
console.log(r3)



上一篇下一篇

猜你喜欢

热点阅读