La parola chiave extends
viene utilizzata nelle dichiarazioni o nelle espressioni di classe per creare un
che funge da sottoclasse di un'altra, con la classe principale (a volte
chiamata "classe base") che funge da prototipo della classe secondaria (a volte
chiamata "sottoclasse" o "classe derivata").
class ParentClass {}
class ChildClass extends ParentClass {}
Object.getPrototypeOf( ChildClass );
> class ParentClass {}
Queste sottoclassi ereditano le proprietà e i metodi della classe padre. Questo consente di estendere la funzionalità di base di una classe per senza sovraccaricare la classe principale per adattarla a ogni possibile caso d'uso, o reimplementando codice con uno scopo simile.
Le classi figlio possono fornire le proprie implementazioni dei metodi ereditati da un corso principale:
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.'"
Puoi anche richiamare metodi definiti nella classe padre nel contesto della
classe secondaria utilizzando 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.'
Come si vede negli esempi precedenti, quando il metodo constructor()
viene omesso in
contesto di una classe figlio, il costruttore implicito di JavaScript chiama
insieme allo stesso insieme di argomenti. Tuttavia, se c'è
nella sottoclasse, deve prima chiamare super()
insieme a qualsiasi
gli argomenti necessari prima di fare riferimento a 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 e setter sono metodi speciali usati esclusivamente per recuperare e definire
rispettivamente. I metodi definiti utilizzando le parole chiave get
e set
consentono
crei metodi con cui interagire come se fossero statici
proprietà.
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
Le proprietà get
e set
sono definite nella proprietà prototipo della classe
e sono quindi disponibili
per tutte le istanze della classe.
Verifica le tue conoscenze
Seleziona le affermazioni vere sulle classi create con la parola chiave extends
.
It can't overwrite methods from a parent class.