2016-02-08 10 views
5

Ich habe an der Aktualisierung von Code für die ES6-Syntax gearbeitet. Ich hatte die folgende Codezeile:Vorteile der ES6 Reflect-API

delete this._foo;

und meine Linter einen Vorschlag angehoben zu verwenden:

Reflect.deleteProperty(this, '_foo');

Sie die Dokumentation here für diese Methode finden können.

Der MDN docs Zustand:

Die Reflect.deleteProperty Methode ermöglicht es Ihnen, eine Eigenschaft auf ein Objekt zu löschen. Es gibt einen booleschen Wert zurück, der angibt, ob die Eigenschaft erfolgreich gelöscht wurde. Es ist fast identisch mit dem nicht strikten Löschoperator.

Ich verstehe, dass das Schlüsselwort delete keinen Wert angibt, der Erfolg anzeigt, aber es ist viel weniger ausführlich.

Wenn ich nicht auf den Erfolg/Misserfolg von delete angewiesen bin, gibt es einen Grund, Reflect.deleteProperty zu bevorzugen? Was bedeutet es, dass delete nicht streng ist?

ich wie viele der Anwendungsfälle für die Reflect API fühlen, sind für Ausnahmefälle zu lösen und/oder besser bedingte Strömung Bereitstellung, aber auf Kosten einer viel ausführlicher Erklärung. Ich frage mich, ob es einen Vorteil gibt, die Reflect API zu verwenden, wenn ich keine Probleme mit meinen aktuellen Verwendungen erfahre.

+0

Ich würde nein sagen, es scheint keine anderen Vorteile zu geben, 'deleteProperty()' zu verwenden. Wenn Sie nicht wissen müssen, ob das Löschen erfolgreich war oder nicht, ist es einfach, 'delete' zu ​​verwenden. – adeneo

+3

'delete' wirft im strikten Modus, wenn die Eigenschaft eine eigene nicht-konfigurierbare Eigenschaft ist, ich rate' deleteProperty() 'wirft in solchen Fällen keinen Fehler – adeneo

+3

Welcher Link schlägt das vor? – Bergi

Antwort

8

Reflect API macht abstrakte Vorgänge sichtbar, die hinter den üblichen JavaScript-Idiomen zurückbleiben. Es ist die Hauptverwendung, um eine sinnvolle Art und Weise zum Weiterleiten von Aktionen bereitzustellen, die unter Proxy Traps aufgerufen werden. Alle Reflect Methoden stimmen mit der Signatur von Proxy-Traps mit demselben Namen überein, sodass Sie new Proxy(target, Reflect) verwenden können, um ein Objekt mit identischem Verhalten wie target Objekt zu erstellen - alles wird weitergeleitet, einschließlich spezieller JavaScript-Macken.

Es ist besonders wichtig für Getter und Prototypen, wie third argument of many methods is "receiver"

Der Wert this für den Anruf vorgesehen zum Ziel, wenn ein Getter angetroffen wird.

Betrachten Sie folgenden Code ein:

var target = { 
    get foo() { 
     return this.bar; 
    }, 
    bar: 3 
}; 
var handler = { 
    get(target, propertyKey, receiver) { 
     if (propertyKey === 'bar') return 2; 

     console.log(Reflect.get(target, propertyKey, receiver)); // this in foo getter references Proxy instance; logs 2 
     console.log(target[propertyKey]); // this in foo getter references "target" - logs 3 
    } 
}; 
var obj = new Proxy(target, handler); 

Wenn Sie Proxy schreiben, Sie erwarten, dass es vollständig Zielobjekt decken - und es gibt keinen idiomatischen Weg, dies ohne Reflect zu tun.

Darüber hinaus ist die Verwendung von Operatoren als Funktionen für die funktionale Stilprogrammierung praktisch.

Verwandte Themen