ES6(5)

129 阅读3分钟

1. 类ES5 (具有相同属性和方法的集合)

一、定义
通过function关键字定义 类名首字母大写
属性写在构造函数里 方法写在原型下

 function Person(name, age) {
      this.name = name;
      this.age = age;
    }
 Person.prototype.sleep =  function() {
      console.log(this.name + ' is sleeping ....');
    }
    
 let p1 = new Person('xm', 20)                       <---------实例化对象

二、继承
1.子类的构造函数中 通过父类.call() 继承父类的属性
2.子类的prototype = 父类的实例化对象 来继承父类的方法
3.子类的constructor指向子类

function Student(name, age, grade) {
      // this
      Person.call(this,name, age)
      // Person(name, age)
      this.grade = grade
    }
    Student.prototype = new Person();
    Student.prototype.constructor = Student;

    Student.prototype.eat = function() {
      console.log(this.name + ' is eating....');
    }

    let s1 = new Student('ls', 21, '18')           <---------实例化对象

2. 类ES6

一、定义
通过class定义类
构造函数里定义属性和方法
static 关键字定义的方法是静态方法 只能通过 类名.方法 来调用 实例化对象不能直接调用

class Person {
      constructor(name, age) {// 定义属性
        this.name = name;
        this.age = age;
      }
      eat() {// 定义方法
        console.log(this.name + ' is eating....')
      }
      sleep() {
        console.log(this.name + ' is sleeping...')
      }
      static fun() {
        console.log(123);
      }
    }  
    
    let p1 = new Person('zs', 18);
    Person.fun();  <-----static定义的方法只能通过 “类名.方法” 来调用 实例化对象不能直接调用

二、继承
es6 里 通过 extends 来实现的继承
通过super()来继承父类的构造函数
...params代表全部参数

  class Student extends Person {
      constructor(name,age,grade) {
        super(name,age,grade)  // 继承父类的构造函数
        this.grade = grade
      }
      code() {
        console.log(this.name + ' is coding...')
      }
    }
    
    
  class Student extends Person {
      constructor(...params) {  //可通过...params接收参数
        super(...params)  // 继承父类的构造函数
        this.grade = params[2]
      }
      code() {
        console.log(this.name + ' is coding...')
      }
    }
    
 let s1 = new Student('xm', 21, '10');

3. generator 函数(异步编程的解决方案)

在function 和 函数名 之间加一个 * yield 执行之后暂停
方法返回的是一个指针对象 需要调用next()执行

function * fun1 (){
      console.log('hello');
      yield '你好';
      console.log('world');
    }
    
let fn1 = fun1();
fn1.next();                           <---------执行函数到yield执行完结束
console.log(fn1.next()); // {value: undefined, done: false} 
                            // value表示yield表达式的返回值
                            // done表示 当前函数是否执行完
fn1.next();                        <---------从yield下面的内容开始继续执行                        
function * fun1 (){
      console.log('hello');
      yield request1();
      console.log('world');
    }
    
let fn1 = fun1();

    function request1() {
      setTimeout(() => {
        console.log('请求成功')
        fn1.next();<---------在内部调用next方法,等待定时器时间结束执行完成之后再继续执行
      }, 1000) 
      return 'requset函数'  <---------yield表达式的返回值  (fn1.next()中的value)
    }

传参

function * fun1 (){
      console.log('hello');
      let res = yield request1(); //  res 的值是next方法调用的时候传递的参数
      console.log(res);
      console.log('world');
    }
    
let fn1 = fun1();

    function request1() {
      setTimeout(() => {
        let obj = {
          name: 'zs',
          age: 18
        }
        console.log('请求成功')
        fn1.next(obj);<---------obj是request1函数返回的参数
      }, 1000) 
    }

模拟发送请求过程 并在request2中接收request1中返回的参数

    function * fun() {
      console.log('准备发送请求1')
      let res = yield request1();           <---------接收request1返回的参数
      console.log('准备发送请求2');
      yield request2(res);        <---------将request1返回的参数传给request2
      console.log('结束')
    }  

    let fn = fun();
    console.log(fn.next())

    function request1() {
      setTimeout(() => {
        let str = 'hello world!';           <---------request1返回的参数
        console.log('请求1成功')
        console.log(fn.next(str));          <---------传参
      }, 1000)
    }

    function request2(res) {
      console.log('res:',res)          <---------成功接收并能打印出参数内容
      setTimeout(() => {
        console.log('请求2成功')
        console.log(fn.next());
      }, 1000)
    }

4. async(异步编程的解决方案)

遇到await等待,当前异步操作完成后就往下继续执行
返回的总是promise对象,可以用then方法进行下一步操作
Async取代Generator函数中的*号,await取代Generator中的yield

    async function fun() {
      console.log('准备发送请求1');
      await request();
      console.log('准备发送请求2')
      await request2();
      console.log('结束');
    }
    
    function request() {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          console.log('请求1成功');
          resolve();
        }, 1500)
      })
    }
    
    function request2() {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          console.log('请求2成功');
          resolve();
        }, 800)
      })
    }

    fun();

5. Proxy

get获取值
set改变值(一定要有return否则值不会改变)

   let obj = {
      name: 'zs',
      age: 18
    }

    let p1 = new Proxy(obj,{
      get(target, key , property) {
        console.log( target, key , property)   //obj对象 获取的值 property函数
        return target[key];
      },
      set(target, key ,value) {
        console.log( target, key ,value)       //obj对象 改变的属性 改变后的值
        return target[key] = value
      }
    })
    
    p1.name = 'ls'                   <---------修改name属性的值
    console.log(p1.name)             <---------获取name的值