2009-07-14 18 views
10

Ich entwerfe einige Klassen und für einige Daten möchte ich Felder verwenden, die konstant sind.So erstellen Sie eine Konstante in Javascript

Jetzt AS USUAL, wird IE nicht den Schlüssel const unterstützen so

const T = 10; 

funktionieren nicht.

ich eine Immobilie über __defineGetter__ und __defineSetter__ schaffen könnte, dass aber , mimen AS USUAL, wird IE diese Syntax nicht unterstützt (IE 8 hat Object.defineProperty aber nicht auf benutzerdefiniertes Objekt arbeiten).

Irgendeine Idee?

Antwort

11

"Keine Lösung" ist wirklich die sicherste Lösung. Momentan gibt es keinen guten Mechanismus, um Konstanten in Javascript zu erzeugen, aber wenn Sie eine Konvention (ALL CAPS FOR CONSTS) erstellen, um sie zu identifizieren und sie nicht selbst zu überschreiben, dann sind Ihre eigenen Konstanten sicher.

Wenn Sie eine öffentliche Bibliothek schreiben und Sie sind wirklich besorgt über jemandem den Wert geändert wird, dann können Sie nur zugänglich zu Ihrem eigenen Code eine private Variable verwenden, indem Rahmen mit einer Funktion steuern:

(function() { 
    var MY_CONSTANT = 42; 
    alert(MY_CONSTANT); // alerts "42" 
    ...do other stuff in here... 
})(); 
alert(MY_CONSTANT); // alerts "undefined" because MY_CONSTANT is out of scope here 

Wenn ein Entwickler kann einen Wert in Javascript lesen, dann kann der Entwickler diesen Wert ändern.

+0

ja die einzige Cross-Browser-kompatible Möglichkeit, eine Art von Konstanten zu definieren, ist die Verwendung von Closures und Methoden für den Zugriff auf diese Variable (als ob es eine private Variable ... hatte). Aber mein Problem bestand darin, dem Entwicklerbenutzer den Wert einer Konstante als obj.MY_CONSTANT zu geben, damit Ihre letzte Lösung nicht passt. Also, am Ende, für diese (IE auch die 8 Vers.) Schrecklichen und inkompatiblen Browser müssen wir Entwickler immer schlechte Lösung finden und unsere Zeiten verschwenden. Wenn M $ verstehen wird, dass Webentwickler STANDARDS wünscht ????? – xdevel2000

+0

Ich werde normalerweise nicht widersprechen, wenn jemand sich über M $ und Standards beschweren will, aber in diesem Fall scheint es unfair, weil JavaScript-Konstanten nicht Teil irgendeiner Spezifikation sind, sie sind Mozilla-spezifisch. – Prestaul

+0

Ja, aber ich bezog mich auf den 'Standard de facto' und const, __defineGetter__ und so weiter werden z.B. per WebKit-Engines (Chrome etc.). Auch das XMLHttpRequest-Objekt ist kein w3C-Standard (es wurde von M $ erfunden), aber es wurde von allen übernommen. – xdevel2000

2

Beachten Sie, dass das Definieren von etwas als Konstante wirklich nur dafür sorgt, dass es nicht überschrieben werden kann.

Wenn Sie wirklich etwas nicht als Konstante definieren können, dann definieren Sie es einfach als Variable und setzen es einmal. Ich nehme an, dass Sie den Code schreiben, so können Sie sicherstellen, dass Sie es nicht überschreiben ...

Nicht ideal offensichtlich, aber es sollte funktionieren.

4

Es gibt eine freeze() Methode in Javascript, die verwendet werden kann, um tatsächliche Konstanten zu erstellen.

Verbrauch:

var consts = {};     // Object to store all constants 
    consts.MY_CONSTANT= 6; 
    Object.freeze(consts);    // Make the consts truly read only 
    consts.MY_CONSTANT= 7;    // Trying to do this will give error 
5

Object.defineProperty ist das, was Sie wollen.

Beispiel:

var obj = {}; 

Object.defineProperty(obj, 'key', { 
    enumerable: false, 
    configurable: false, 
    writable: false, 
    value: 'static' 
}); 

Wil definieren "obj.key" mit dem Wert: "statisch" und es wird nur lesbar sein.

  • Enumerierbar bedeutet, dass es beim Aufzählen der Eigenschaften eines Objekts angezeigt wird (oder nicht).
  • Beschreibbar bedeutet, wenn Sie es nur lesen möchten, würden Sie falsch sagen. nicht beschreibbar
  • Konfigurierbar zu false, wenn Sie nicht möchten, dass es vom Objekt löschbar ist.
  • Im Wesentlichen, indem Sie alle auf false setzen, erstellen Sie Konstanten auf dem Objekt. BTW, ihre Voreinstellungen sollen falsch sein.

    So dies effektiv zu tun:

    Object.defineProperty(obj, 'property', { value: 'value'}); 
    

    auf dem ein konstanten schaffen 'obj' genannt 'Eigentum' mit dem Wert 'Wert'. Oder Sie könnten dies tun

    function setConstant(obj, key, value) 
    { 
        Object.defineProperty(obj, key, {value: value }); 
    } 
    
    var obj = {}; 
    setConstant(obj, "constantName", "constantValue"); 
    

    Würde es sehr lesbar machen.

    1

    alte Frage, aber heute Sie können einfach Verwendung:

    const MY_CONST = 10; 
    

    Von MDN:

    Die const Deklaration erstellt eine schreibgeschützte Verweis auf einen Wert. Es bedeutet nicht, dass der Wert, den es enthält, unveränderlich ist, nur dass der Variablenbezeichner nicht neu zugewiesen werden kann.

    Supported by alle Hauptbrowser bereits.

    Verwandte Themen