In Java Script ist eigentlich alles ein Key-Value Store. Es gibt immer eine Variable oder Property und diese hat einen Namen und ein Wert. Der Wert kann dann z.B. Number, Boolean, Function, Null, usw. sein. Man kann so eigentlich alles modifizieren. Auch existierende Werte wie z.B. window.console.

Einen wirklichen Schutz auf Klassen gibt es auch nicht, da private, protected und public (noch) nicht implementiert ist.

Aber es gibt eine kaum bekannte Möglichkeit ein Objekt auf drei verschiedene Arten vor Veränderung zu Schützen:

Object.freeze()

Mit freeze() wird das ganze Objekt eingefroren und man kann weder Eigenschaften hinzufügen, löschen noch bearbeiten.

const obj = {
  prop: 42
};

Object.freeze(obj);

obj.prop = 33;
// Löst einen Fehler im strict mode aus

console.log(obj.prop);
// Erwartete Ausgabe: 42

Object.seal()

Mit seal() versiegelt man ein Objekt. So wird verhindert, dass neue Eigenschaften hinzugefügt werden können und markiert alle vorhandenen Eigenschaften als nicht konfigurierbar. Dies hat zur Folge, dass die Eigenschaften für das Objekt fest und unveränderlich werden.

const object1 = {
  property1: 42
};

Object.seal(object1);
object1.property1 = 33;
console.log(object1.property1);
// Erwartete Ausgabe: 33

delete object1.property1; // Kann nicht gelöscht werden
console.log(object1.property1);
// Erwartete Ausgabe: 33

Object.preventExtensions()

Mit preventExtensions() verhindert man, das Eigenschaften hinzugefügt werden können. Bestehende Eigenschaften können jedoch geändert werden.

const object1 = {};

Object.preventExtensions(object1);

try {
  Object.defineProperty(object1, 'property1', {
    value: 42
  });
} catch (e) {
  console.log(e);
  // Erwartete Ausgabe: TypeError: Cannot define property property1, object is not extensible
}

Also doch drei nützliche Methoden. Gleich mal einbauen.

Viel Spaß damit!

Und hier noch die Belohnung für die Facebook freunde 😉