精读阮一峰 ECMAScript 6 入门 阶段4

116 阅读1分钟

深入学习了es6类的实现,相对于es5构造函数来说更加简洁了,就是语法糖。

  static hello() {
    console.log('hello world');
  }
}

class B extends A {
}

B.hello()  // hello world

class Foo {
    #p = 1;
    #m() {
      console.log('hello');
    }
  }
  
  class Bar extends Foo {
    constructor() {
      super();
      console.log(this.#p); // 报错
      this.#m(); // 报错
    }
  }

class Point { /*...*/ }

class ColorPoint extends Point { /*...*/ }

Object.getPrototypeOf(ColorPoint) === Point

class A {
    constructor() {
      console.log(new.target.name);
    }
  }
  class B extends A {
    constructor() {
      super();
    }
  }
  new A() // A
  console.log(new B()); // B

class A {
    constructor() {
      this.x = 1;
    }
  }
  
  class B extends A {
    constructor() {
      super();
      this.x = 2;
      super.x = 3;
      console.log(super.x); // undefined
      console.log(this.x); // 3
    }
  }
  
  let b = new B();

class Parent {
    static myMethod(msg) {
      console.log('static', msg);
    }
  
    myMethod(msg) {
      console.log('instance', msg);
    }
  }
  
  class Child extends Parent {
    static myMethod(msg) {
      super.myMethod(msg);
    }
  
    myMethod(msg) {
      super.myMethod(msg);
    }
  }
  
  Child.myMethod(1); // static 1
  
  var child = new Child();
  child.myMethod(2); // instance 2

class A {
    constructor() {
      this.x = 1;
    }
    static print() {
      console.log(this.x);
    }
  }
  
  class B extends A {
    constructor() {
      super();
      this.x = 2;
    }
    static m() {
      super.print();
    }
  }
  
  B.x = 3;
  B.m() // 3

class A {
}

console.log(A.__proto__ === Function.prototype); // true
console.log(A.prototype.__proto__ === Object.prototype); // true

class NewObj extends Object{
    constructor(){
      super(...arguments);
    }
  }
  var o = new NewObj({attr: true});
  console.log(o.attr === true);  // false

function mix(...mixins) {
    class Mix {
      constructor() {
        for (let mixin of mixins) {
          copyProperties(this, new mixin()); // 拷贝实例属性
        }
      }
    }
  
    for (let mixin of mixins) {
      copyProperties(Mix, mixin); // 拷贝静态属性
      copyProperties(Mix.prototype, mixin.prototype); // 拷贝原型属性
    }
  
    return Mix;
  }
  
  function copyProperties(target, source) {
    for (let key of Reflect.ownKeys(source)) {
      if ( key !== 'constructor'
        && key !== 'prototype'
        && key !== 'name'
      ) {
        let desc = Object.getOwnPropertyDescriptor(source, key);
        Object.defineProperty(target, key, desc);
      }
    }
  }