2017-07-11 1 views
0

Vu le cas suivant:Tapuscrit empêcher le chevauchement des propriétés de classe des enfants

class Parent { 
 
    propStr = "Hello"; 
 
    propNum = 42; 
 

 
    constructor(propShared) { 
 
     console.log(this.propStr); // Hello 
 
     console.log(this.propNum); // 42 
 
     console.log(this.propShared); // w/e 
 
    } 
 
} 
 

 
class Child extends Parent { 
 
    propStr = "Hi"; // overridden 
 
    propNum = 1337; // overridden 
 

 
    constructor(propShared) { 
 
     super(propShared); 
 
    } 
 
} 
 

 
let c = new Child("Foobar");

Comment puis-je faire en sorte que les propriétés mères sont bien écrasées, de sorte que le console.log imprime les propriétés de l'enfant?

Répondre

2

Vous consignez les propriétés à partir du constructeur parent, où elles sont pas encore écrasées par le code du constructeur enfant qui s'exécute après super(). Vous ne devez faire l'initialisation dans le constructeur, pas exécuter d'effets secondaires:

class Parent { 
    propStr = "Hello"; 
    propNum = 42; 

    log() { 
     console.log(this.propStr); 
     console.log(this.propNum); 
    } 
} 

class Child extends Parent { 
    propStr = "Hi"; // overridden 
    propNum = 1337; // overridden 
} 

const c = new Child("Foobar"); 
c.log() 

Si vous voulez que l'initialisation à dépendre des choses choisies ailleurs, y compris les classes d'enfants, les paramètres font. Vous pouvez toujours leur donner des valeurs par défaut raisonnables:

class Parent { 
    constructor(propStr = "Hello", propNum = 42, propShared) { 
     this.propStr = propStr; 
     this.propNum = propNum; 
     this.propShared = propShared; 
    } 
    log() { 
     console.log(this.propStr); 
     console.log(this.propNum); 
     console.log(this.propShared); 
    } 
} 

class Child extends Parent { 
    constructor(propShared) { 
     super("Hi", 1337, propShared); 
    } 
} 

const c = new Child("Foobar"); 
c.log();