2017-04-20 1 views
0

En essayant de créer une véritable classe abstraite en javascript, si vous essayez d'instancier une classe abstraite, elle génère une erreur. Le problème est, quand je fais cela, je ne peux pas créer de valeurs par défaut dans la classe abstraite. Voici mon code:Création d'une véritable classe abstraite en Javascript

class Abstract { 
    constructor() { 
    if (new.target === Abstract) { 
     throw new TypeError("Cannot create an instance of an abstract class"); 
    } 
    } 

    get Num() { return {a: 1, b: 2} } 
    get NumTimesTen() { return this.Num.a * 10 } 
} 

class Derived extends Abstract { 
    constructor() { 
    super(); 
    } 
} 

//const a = new Abstract(); // new.target is Abstract, so it throws 
const b = new Derived(); // new.target is Derived, so no error 

alert(b.Num.a) // this return 1 
b.Num.a = b.Num.a + 1 
alert(b.Num.a) // this also returns 1, but should return 2 
alert(b.NumTimesTen) // this returns 10, but should return 20 

Cela se produit parce que ma fonction get est Recréant que cet objet à chaque fois qu'il est appelé. Dans une classe functino, j'aurais utilisé this.Num, mais cela ne compile pas dans la syntaxe de la classe. Que devrais-je faire?

Répondre

0

Compris. Je peux toujours mettre du code d'instanciation variable dans le constructeur abstrait.

class Abstract { 
    constructor() { 
    this.thing = {a: 1, b: 2} 
    if (new.target === Abstract) { 
     throw new TypeError("Cannot create an instance of an abstract class") 
    } 
    } 

    get Thing() { return this.thing } 
    get ThingATimesTen() { return this.thing.a * 10 } 
} 

class Derived extends Abstract { 
    constructor() { 
    super() 
    } 
} 

//const a = new Abstract(); // new.target is Abstract, so it throws 
const b = new Derived(); // new.target is Derived, so no error 

alert(b.Thing.a) // this return 1 
b.Thing.a = b.Thing.a + 1 
alert(b.Thing.a) // now returns 2 
alert(b.ThingATimesTen) // now returns 20