Jestem zdezorientowany co do celu getters i setters w klasach ECMAScript 6. Co jest celem? Poniżej przykład, do którego się odwołuję:
class Employee {
constructor(name) {
this._name = name;
}
doWork() {
return `${this._name} is working`;
}
get name() {
return this._name.toUpperCase();
}
set name(newName){
if(newName){
this._name = newName;
}
}
}
class
ecmascript-6
setter
getter
TruMan1
źródło
źródło
Odpowiedzi:
Te metody ustawiające i pobierające umożliwiają bezpośrednie użycie właściwości (bez używania nawiasów)
Służy to tylko do ustawienia i uzyskania wartości właściwości.
źródło
set name(newName) { this._name = newName; }
Get:get name() { return this._name.toUpperCase(); }
Metody pobierające i ustawiające w ES6 służą temu samemu celowi, co w innych językach ... w tym w ES5. ES5 już pozwala na metody pobierające i ustawiające
Object.defineProperty
, chociaż są one mniej czyste i bardziej kłopotliwe w użyciu.W efekcie metody pobierające i ustawiające umożliwiają używanie standardowej notacji dostępu do właściwości do odczytów i zapisów, przy jednoczesnym zachowaniu możliwości dostosowywania sposobu pobierania i mutowania właściwości bez konieczności stosowania jawnych metod pobierających i ustawiających.
W powyższej klasie Pracownik oznaczałoby to, że możesz uzyskać dostęp do usługi w
name
następujący sposób:Byłoby to wyglądać jak normalny dostęp do nieruchomości, ale to właściwie nazwać
toUpperCase
imienia przed wpuszczeniem go. Podobnie, robiąc to:uzyskałby dostęp do settera i nie zmodyfikowałby wewnętrznej
_name
właściwości z powodu klauzuli guard wprowadzonej wname
seterze.Zobacz także ogólne pytanie Dlaczego warto używać metod pobierających i ustawiających? aby uzyskać więcej informacji o tym, dlaczego możliwość modyfikowania funkcjonalności dostępu członków jest przydatna.
źródło
Programy pobierające i ustawiające w ES6 mają zasadniczo inną motywację niż podobne koncepcje w Javie.
W Javie metody pobierające i ustawiające pozwalają klasie na definiowanie komponentów JavaBean. Celem metod pobierających i ustawiających jest to, że pozwalają one fasoli mieć całkowicie ortogonalny „interfejs” w porównaniu z polami publicznymi. Więc mogę mieć pole „nazwa”, które NIE jest właściwością JavaBean i mogę mieć „adres” właściwości JavaBean, który NIE jest polem.
Właściwości JavaBean są również „wykrywalne” przez tysiące frameworków (na przykład Hibernate) poprzez odbicie języka Java. Zatem metody pobierające i ustawiające są częścią standardowej metody „ujawniania” właściwości fasoli.
Metody pobierające i ustawiające, będąc funkcjami, mają również tę wartość, że „abstraktują” implementację. Może to być ALBO pole lub wartość obliczona („syntetyczna”). Więc jeśli mam właściwość fasoli o nazwie „kod pocztowy”, która zaczyna się jako przechowywany ciąg. A teraz przypuśćmy, że chcę zmienić to na wartość obliczoną na podstawie adresu / miasta / stanu?
Jeśli używam pola, ten kod się psuje:
Ale jeśli używam gettera, to się nie psuje:
JavaScript nie ma nic takiego jak JavaBeans. O ile czytałem, zamierzona wartość GET i SET jest ograniczona do wspomnianych powyżej właściwości „syntetycznych” (obliczonych).
Ale jest nieco lepszy niż java, ponieważ podczas gdy Java nie pozwala na kompatybilną konwersję "pola" na metodę, ES6 GET i SET na to pozwala.
To znaczy, jeśli mam:
Jeśli zmienię kod pocztowy ze standardowej właściwości obiektu na getter, powyższy kod wywoła teraz funkcję GET.
Zwróć uwagę, że jeśli nie uwzględniłem GET w definicji, NIE wywołałoby to metody GET kodu pocztowego. Zamiast tego po prostu przypisałby kod pocztowy funkcji do zmiennej.
Myślę więc, że są to ważne różnice, które należy odróżnić między metodami pobierającymi i ustawiającymi w języku Java i JavaScript w ES6.
źródło
W każdym razie
getter
isetter
jest jak szpieg. Szpieguje właściwość obiektu, dzięki czemu możesz coś zrobić za każdym razem, gdy otrzymasz lub ustawisz wartość tej właściwości.źródło