2016-02-08 7 views
5

Pracuję nad uaktualnieniem kodu do użycia składni ES6. Miałem następujący wiersz kodu:Zalety interfejsu ES6 Reflect API

delete this._foo;

i mój linter podniesiony sugestię użycia:

Reflect.deleteProperty(this, '_foo');

można znaleźć w dokumentacji tej metody here.

MDN Docs stan:

Sposób Reflect.deleteProperty pozwala usunąć właściwość na obiektu. Zwraca wartość logiczną wskazującą, czy właściwość została pomyślnie usunięta. Jest prawie identyczny z nieostrym operatorem usuwania .

Rozumiem, że słowo kluczowe delete nie zwraca wartości wskazującej na sukces, ale jest znacznie mniej szczegółowe.

Jeśli nie jestem zależny od sukcesu/niepowodzenia delete czy jest jakiś powód, aby faworyzować Reflect.deleteProperty? Co to znaczy, że delete nie jest restrykcyjna?

Czuję, że wiele przypadków użycia dla interfejsu API Reflect służy do rozwiązywania wyjątkowych przypadków i/lub zapewniania lepszego przepływu warunkowego, ale kosztem znacznie bardziej szczegółowego stwierdzenia. Zastanawiam się, czy istnieje jakaś korzyść z używania interfejsu API Reflect, jeśli nie mam żadnych problemów z bieżącymi zastosowaniami.

+0

Powiedziałbym, że nie, nie ma żadnych innych korzyści z używania 'deleteProperty()'. Jeśli nie musisz wiedzieć, czy usunięcie nie powiodło się, po prostu użyj 'delete' jest w porządku. – adeneo

+3

'delete' wyrzuca w trybie ścisłym, jeśli właściwość jest własną, nie konfigurowalną właściwością, zgaduję, że' deleteProperty() 'nie generuje błędu w takich przypadkach. – adeneo

+3

Co sugeruje to liner? – Bergi

Odpowiedz

8

Reflect API ujawnia abstrakcyjne operacje pozostające w tyle za popularnymi idiomami JavaScript. Jest to główny sposób dostarczania rozsądnego sposobu przesyłania dalej działań nazwanych Proxy pułapek. Wszystkie metody Reflect są zgodne z sygnaturą pułapek proxy o tej samej nazwie, więc można użyć obiektu new Proxy(target, Reflect) do utworzenia obiektu o identycznym zachowaniu, co obiekt target - wszystko zostanie przekazane, w tym specjalne dziwactwa JavaScript.

Jest to szczególnie ważne dla pobierające i prototypów, jak third argument of many methods is "receiver"

Wartość this przewidziano zaproszenia do celu, jeśli getter spotyka.

Rozważmy następujący kod:

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); 

Kiedy piszesz Proxy, można oczekiwać, że do pełnego pokrycia obiektu docelowego - i nie ma idiomatyczne sposób to zrobić bez Reflect.

Co więcej, posiadanie operatorów jako funkcji jest wygodne dla programowania stylu funkcjonalnego.