2016-02-06 11 views
5

Czy istnieje sposób zdefiniowania const w konstruktorze klasy?Definiowanie const w konstruktorze klas (ES6)

Próbowałem to:

class Foo { 
    constructor() { 
     const bar = 42; 
    } 

    getBar =() => { 
     return this.bar; 
    } 
} 

Ale

var a = new Foo(); 
console.log (a.getBar()); 

powraca niezdefiniowane.

+0

@Bergi Nawet nie tak bardzo, jak o to pytam. – alexandernst

+0

Cóż [to] (http://stackoverflow.com/questions/13418669/javascript-do-i-need-to-put-this-var-for-every-variable-in-an-object) wyjaśnia różnicę między zmienne i właściwości, z którymi wydaje się, że masz problemy. Prawdą jest, że nie mówi ci, jak zdefiniować nieopisane właściwości. – Bergi

Odpowiedz

13

użyć statycznej właściwości tylko do odczytu do deklarowania wartości stałych, które są zawężona do klasy.

class Foo { 
    static get BAR() { 
     return 42; 
    } 
} 

console.log(Foo.BAR); // print 42. 
Foo.BAR = 43; // triggers an error 
+1

W rzeczywistości '=>' nie powinno tam być. – alexandernst

+0

@alexandernst thanks. – cgTag

0

Problem jest z „bar” scopingu - jest zawężona do konstruktora:

'use strict'; 

class Foo { 
    constructor() { 
     const bar = 42; 
     this.bar = bar; // scoping to the class 
    } 

    getBar() { 
     return this.bar; 
    } 
} 

var a = new Foo(); 
console.log (a.getBar()); 
+0

Ah, rozumiem. Robiąc to w ten sposób, właściwości "const" są zachowane, prawda? – alexandernst

+1

@alexandernst - nie, 'this.bar' nie będzie stałą i można go nadpisać – adeneo

+1

Więc jaki jest sens" const "w ogóle, jeśli nie można go użyć w klasie? – alexandernst

1

Wystarczy zdefiniowania stałej w konstruktorze nie dołączyć go do instancji, trzeba ustawić go za pomocą this. Zgaduję, chcesz niezmienność, dzięki czemu można używać getters:

class Foo { 
    constructor() { 
     this._bar = 42; 
    } 

    get bar() { 
     return this._bar; 
    } 
} 

Wtedy można go używać jak ty normalnie:

const foo = new Foo(); 
console.log(foo.bar) // 42 
foo.bar = 15; 
console.log(foo.bar) // still 42 

To nie wygeneruje błąd, gdy próbuje zmienić bar. Jeśli chcesz, możesz zgłosić błąd w setera:

class Foo { 
    constructor() { 
     this._bar = 42; 
    } 

    get bar() { 
     return this._bar; 
    } 

    set bar(value) { 
     throw new Error('bar is immutable.'); 
    } 
} 
Powiązane problemy