扩展类

extends 关键字用于类声明或表达式来创建 作为另一个类的子类,它具有父类(有时 作为子类(有时为 称为“子类”或“派生类”)。

class ParentClass {}
class ChildClass extends ParentClass {}

Object.getPrototypeOf( ChildClass );
> class ParentClass {}

这些子类会继承父类的属性和方法。这个 您可以扩展类的核心功能,以实现更具体的功能, 而无需重载父类来适应每个可能的用例, 或重新实现具有类似用途的代码。

子类可以提供自己的继承方法实现 从父类加载:

class MyClass {
  constructor( myPassedValue ) {
    this.instanceProp = myPassedValue;
  }
  classMethod() {
    console.log( `The value was '${ this.instanceProp }.'`)
  }
}
class ChildClass extends MyClass {
  classMethod() {
    console.log( `The value was '${ this.instanceProp },' and its type was '${ typeof this.instanceProp }.'`)
  }
}

const myParentClassInstance = new MyClass( "My string." );
const mySubclassInstance = new ChildClass( 100 );

myParentClassInstance.classMethod();
> "The value type was 'string.'"

mySubclassInstance.classMethod();
> "The value was '100,' and its type was 'number.'"

您还可以在 使用 super 的子类:

class MyClass {
  constructor( myPassedValue ) {
    this.instanceProp = myPassedValue;
  }
  classMethod() {
    console.log( `The value was '${ this.instanceProp }.'`)
  }
}

class ChildClass extends MyClass {
  subclassMethod() {
    super.classMethod();
    console.log( `The value type was '${ typeof this.instanceProp }.'`)
  }
}
const mySubclassInstance = new ChildClass( 100 );

mySubclassInstance.subclassMethod();
> The value was '100.'
> The value type was 'number.'

如前面的示例所示,当 中省略 constructor() 方法时 子类的上下文,JavaScript 的隐式构造函数会调用父类的构造函数 以及同一组实参。不过,如果有 构造函数,必须先调用 super() 以及任何 在引用 this 之前必须传递参数。

class MyClass {
  constructor( myPassedValue ) {
    this.instanceProp = myPassedValue;
  }
  classMethod() {
    console.log( `The value was '${ this.instanceProp }.'`)
  }
}

class ChildClass extends MyClass {
    constructor( myPassedValue ) {
        super( myPassedValue );
        this.modifiedProp = myPassedValue + 50;
    }\
    subclassMethod() {
        super.classMethod();
        console.log( `The value type was '${ typeof this.instanceProp }.'`)
    }
}
const mySubclassInstance = new ChildClass( 100 );

mySubclassInstance;
> MyClass { instanceProp: 100, modifiedProp: 150 }

getter 和 setter 是专门用于检索和定义 值。使用 getset 关键字定义的方法允许 您创建可以像静态方法一样与之交互的方法 属性。

class MyClass {
    constructor( originalValue ) {
        this.totalValue = 0;
    }
    set doubleThisValue( newValue ) {
        this.totalValue = newValue * 2;
    }
    get currentValue() {
        console.log( `The current value is: ${ this.totalValue }` );
    }
}
const myClassInstance = new MyClass();

myClassInstance;
> MyClass { totalValue: 0 }

myClassInstance.doubleThisValue = 20;

myClassInstance.currentValue;
> The current value is: 40

getset 属性在类的原型属性中定义, 因此可供类的所有实例使用。

检查您的理解情况

请选择关于使用 extends 关键字创建的类的真实陈述。

它会继承其父类的属性和方法。
它充当其扩展的类的父级。
它充当其扩展的类的子级。
It can't overwrite methods from a parent class.