填坑-十万个为何?(24)

简介:不少概念不清或忘记,从新构建本身的知识体系。天天问本身1~多个问题。我是菜鸟 成为大神之路!es6

1.Es6 Class经过extends关键字实现继承 Link Class & extends & super

class ColorPoint extends Point {
  constructor(x, y, color) {
    super(x, y); // 调用父类的constructor(x, y)
    this.color = color;
  }

  toString() {
    return this.color + ' ' + super.toString(); // 调用父类的toString()
  }
}
复制代码

①上面代码中,constructor方法和toString方法之中,都出现了super关键字,它在这里表示父类的构造函数,用来新建父类的this对象。数组

②子类必须在constructor方法中调用super方法,不然新建实例时会报错。这是由于子类本身的this对象,必须先经过父类的构造函数完成塑造,获得与父类一样的实例属性和方法,而后再对其进行加工,加上子类本身的实例属性和方法。若是不调用super方法,子类就得不到this对象。函数

③在子类的构造函数中,只有调用super以后,才能够使用this关键字,不然会报错。这是由于子类实例的构建,基于父类实例,只有super方法才能调用父类实例。ui

④父类的静态方法,也会被子类继承this

2.基于Mixin模式实现多继承 Link Mixin

Mixin 指的是多个对象合成一个新的对象,新对象具备各个组成成员的接口spa

将多个类的接口“混入”(mix in)另外一个类prototype

function mix(...mixins) {
  class Mix {}
  for (let mixin of mixins) {
    copyProperties(Mix.prototype, mixin); // 拷贝实例属性
    copyProperties(Mix.prototype, Reflect.getPrototypeOf(mixin)); // 拷贝原型属性
  }
  return Mix;
}

function copyProperties(target, source) {
  for (let key of Reflect.ownKeys(source)) { //Reflect.ownKeys()方法返回一个由目标对象自身的属性键组成的数组
    if ( key !== "constructor"
      && key !== "prototype"
      && key !== "name"
    ) {
      let desc = Object.getOwnPropertyDescriptor(source, key);//方法返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不须要从原型链上进行查找的属性)
      Object.defineProperty(target, key, desc);//方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
    }
  }
}
复制代码
相关文章
相关标签/搜索