2012-04-02 7 views
3

Dies ist eine Frage, wie JavaScript Getter und Setter funktionieren.Delete in JavaScript verwenden Getter/Setter zum Löschen des Getter/Setter

Mozillas Implementierung von log4j als JavaScript-Modul (teilweise Implementierung, nur die wichtigen Teile, die für die vorgesehenen Anwendungsfälle wie in Firefox Sync benötigt werden) enthält die folgende Getter/Setter-Definition.

Was macht das "Löschen" im Getter/Setter für Sie? Was bedeutet das überhaupt? Es hat den Effekt, dass die erste Verwendung andere Ergebnisse als die folgenden verwendet (wenn ja, wie)?

get repository() { 
    delete Log4Moz.repository; 
    Log4Moz.repository = new LoggerRepository(); 
    return Log4Moz.repository; 
}, 
set repository(value) { 
    delete Log4Moz.repository; 
    Log4Moz.repository = value; 
}, 

Antwort

0

Betreiber löschen löscht eine Eigenschaft eines Objekts. wenn Sie ein Objekt haben

o = {a: "Hallo", b: "Welt"};

und Sie tun

löschen o.a;

Ihr Objekt aussehen wird dieses

o = {b: "Welt"};

und danach, wenn Sie

o.a = "foo" zu tun;

wird es neue Eigenschaft eines o auf Objekt und den Wert "foo" zuweisen und Ihre Aufgabe wird sein, wie

o = {a: "foo", b: "Welt"} ;

+1

Wäre o.a danach noch ein Getter (oder Setter), wenn es so angefangen hätte? Ich denke nicht, jetzt wäre es nur ein Wert, oder? (Wie können Sie feststellen, ob eine Eigenschaft ein Getter/Setter ist oder nicht? Gibt es eine Möglichkeit, das Objekt, das sagt, welche Eigenschaften Getter/Setter sind, zu inspizieren/abzulegen?) –

2

Die Frage (und vorhandene Antworten) fehlt ein wichtiger Teil des Kontextes; Getter und Setter sind auf dem Log4Moz-Objekt definiert. Was passiert dann, wenn entweder der Getter oder Setter aufgerufen wird und die Eigenschaft gelöscht wird, für die sie definiert wurde?

delete auf Accessor-Eigenschaften (Eigenschaften mit get/set) hat die gleiche Wirkung wie auf Dateneigenschaften, nämlich dass die Eigenschaft entfernt wird. Nach der Ausführung von delete Log4Moz.repository ist die repository-Eigenschaft nicht mehr auf dem Objekt Log4Moz vorhanden und die Getter/Setter-Funktionen sind nicht mehr an diese Eigenschaft gebunden.

Die nächsten Zeilen, die Log4Moz.repository zuweisen verhalten sich wie Sie erwarten. Eine Dateneigenschaft wird im Objekt Log4Moz mit dem angegebenen Wert erstellt.

Im Endeffekt ersetzt dies eine Accessor-Eigenschaft durch eine Dateneigenschaft nach dem ersten Zugriff (Get oder Set), wodurch eine lazy-initialisierte Dateneigenschaft erstellt wird.

+0

Ausgezeichnete Antwort. –

Verwandte Themen