ES6:从父类访问继承的类的属性和方法

时间:2017-11-23 10:23:26

标签: javascript ecmascript-6

ES6没有抽象方法或属性,但是我可以从继承类中获取父类中的一些方法或属性吗?

class ParentClass {

    constructor(){

      ParentClass.checkClildPropertyAccessibility();
      ParentClass.checkClildMethodAccessibility();

      ParentClass.checkClildStaticPropertyAccessibility();
      ParentClass.checkClildStaticMethodAccessibility();

    }

    static checkClildPropertyAccessibility() {
        console.log(ParentClass.childProperty);
    }

    static checkClildMethodAccessibility(){
        ParentClass.childMethod()
    }

    static checkClildStaticPropertyAccessibility(){
        console.log(ParentClass.childStaticProperty);
    }

    static checkClildStaticMethodAccessibility(){
        ParentClass.clildStaticMethod()
    }
}

class ChildClass extends ParentClass {

    constructor(){
        super();
        ChildClass.childProperty = 'child\'s Property: OK';
    }

    childMethod(){
        console.log('child\'s method OK');
    }

    // static property emulation is ES6
    static get childStaticProperty() { return 'Child\'s static property: OK even ES6' }

    static clildStaticMethod (){
        console.log('Child\'s static method: OK');
    }      
}

let childClassInstance = new ChildClass(); 

概念是“我们必须在子类中定义一些属性和方法,但是父类需要它们在构造函数中使用”。

2 个答案:

答案 0 :(得分:0)

可以将父类中的当前构造函数引用为静态方法中的this,将实例方法中引用为this.constructor

这会导致潜在的设计问题,因为ParentClass没有在ChildClass中定义的方法和属性,而new ParentClass会在不存在时导致错误{{1}调用。

答案 1 :(得分:0)

,可以调用仅在ES2015类的子类中定义的方法。

class ParentClass {

  constructor() {
    this.childMethod();
    this.initialize();
    console.log(this.childProperty1);
    console.log(this.childProperty2);
  }
}

class ChildClass extends ParentClass {

  constructor() {
    super();
    this.childProperty1 = 'child\'s Property: OK';
  }

  initialize() {
    this.childProperty2 = 'child\'s Property 2: OK';
  }

  childMethod() {
    console.log('Child\'s overriden method: OK');
  }
}

let childClassInstance = new ChildClass();

注意initialize()用于将初始值分配给childProperty2。父构造函数将始终在子类构造函数中的任何其他代码之前运行,这就是在进行控制台调用时未初始化childProperty1的原因。在父类中,this将指向具有子类prototype的对象。 在评论部分,Bergi指出应该避免在父构造函数中调用重写方法的做法,因为overriden方法可能取决于子构造函数尚未设置的状态。

,它不适用于静态方法。 即使将静态方法复制到子类,,当您引用ParentClass时,您将获得在那里定义的方法。那里没有原型链。

编辑来自评论部分的说明。