2015-01-29 16 views
76

Jestem zdezorientowany co do tego, na czym polega punkt pobierający i ustawiający w klasach ECMAScript 6. Co jest celem? Poniżej znajduje się przykład mam na myśli:Co to są moduły pobierające i ustawiające dla klas ECMAScript 6?

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; 
     } 
    } 
} 
+0

Jest podobny do tych w C#, jeśli wiesz o tym. –

+0

Powiązane: [Jaki jest argument dotyczący używania programów pobierających i ustawiających ES6 w konwencji getProperty/setProperty?] (Http://stackoverflow.com/q/32114468/1048572) – Bergi

+0

Dobry artykuł wyjaśniający tę kwestię można znaleźć pod adresem: https://coryrylan.com/blog/javascript-es6-class-syntax "W naszej klasie powyżej mamy getter i seter dla naszej własności nazwy. Używamy konwencji _, aby utworzyć pole zaplecza do przechowywania naszej własności nazwy. za każdym razem, gdy wywoływany jest set lub get, spowodowałby przepełnienie stosu "... Mówi także o zmiennej, która nie jest prawdziwie" prywatna ", ale istnieje wiele nowych sposobów tworzenia prywatnych zmiennych w klasach JS; moim ulubionym jest po prostu używanie Maszynopisu, ale użyłem także podejścia Symbolu. – webdevinci

Odpowiedz

83

Są setter i getter pozwala bezpośrednio korzystać z właściwości (bez użycia nawiasów)

var emp = new Employee("TruMan1"); 

if (emp.name) { 
    // uses the get method in the background 
} 

emp.name = "New name"; // uses the setter in the background 

To jest tylko ustawienie i uzyskać wartość właściwości.

+1

Czy chodziło Ci o własność zamiast o atrybut? Nieco mylące dla mnie – Krizzu

+0

Dobre oko, @Krizzu. Atrybuty istnieją w JavaScript i są zupełnie inne niż właściwości. Odpowiedź rzeczywiście odnosi się do właściwości, a nie atrybutów. Edytowałem odpowiedź. Nie sądzę, żeby odpowiedź miała coś przeciwko. :) –

+0

Nie jestem całkiem pewien, czy to naprawdę jest taka zaleta, to jakoś ukrywa pojęcie używania seterów/getterów. Klient danej klasy może myśleć, że bezpośrednio korzysta z właściwości, gdzie nie jest odpowiedni, ale zgadzam się, że przestrzega zasady ukrywania informacji/szczegółów. Może jeśli użyjemy tego w konsekwencji, ułatwi to korzystanie i po prostu muszę się do tego przyzwyczaić ... –

36

pobierające i ustawiające w ES6 służyć temu samemu celowi, co robią w innych językach ... tym ES5. ES5 już zezwala na pobieranie i ustawianie za pośrednictwem Object.defineProperty, ale są one mniej czyste i bardziej niewygodne w użyciu.

Efektywnie, moduły pobierające i ustawiające umożliwiają stosowanie standardowej notacji dostępu do właściwości dla odczytów i zapisów, zachowując jednocześnie możliwość dostosowania sposobu, w jaki właściwość jest pobierana i modyfikowana bez koniecznych jawnych metod pobierania i ustawiania.

W klasie Pracownik powyżej, oznaczałoby to, można uzyskać dostęp do właściwości name takiego:

console.log(someEmployee.name); 

Byłoby zajrzeć jak normalny dostęp do nieruchomości, ale to właściwie nazwać toUpperCase imienia przed zwrócenie go. Podobnie, to robi:

someEmployee.name = null; 

by uzyskać dostęp do setter, a nie byłoby zmienić wewnętrzną _name własności z powodu klauzuli straży wprowadzonego w seter name „s.

Zobacz także ogólne pytanie Why use getters and setters?, aby uzyskać więcej informacji na temat tego, dlaczego przydatna jest możliwość modyfikowania funkcji dostępu członków.

+0

Bardzo jasne wyjaśnienie. Dziękuję Ci! –

0

Programy pobierające i ustawiające ES6 mają istotnie inną motywację niż podobne koncepcje w języku Java.

W języku Java, moduły pobierające i ustawiające umożliwiają klasie definiowanie obiektu JavaBean. Punktami pobierającymi i ustawiającymi jest to, że pozwala to na to, aby komponent bean był całkowicie ortogonalny "z interfejsu" sugerowanego przez pola publiczne. Mogę więc mieć pole "name", które NIE jest właściwością JavaBean, i mogę mieć właściwość JavaBean "address", która NIE jest polem.

Właściwości JavaBean są również "wykrywalne" przez tysiące frameworków (na przykład Hibernate) poprzez odbicie Java. Tak więc, pobierające i ustawiające są częścią standardowej metody "eksponowania" właściwości komponentu bean.

Programy pobierające i ustawiające, będące funkcjami, mają również wartość, że "abstrakcyjnie" implementują. Może to być zarówno pole, jak i obliczona ("syntetyczna") wartość. Więc jeśli mam właściwość bean o nazwie "zipcode", która zaczyna się jako zapisany ciąg znaków. Teraz przypuśćmy, że chcę go zmienić na wartość wyliczoną z adresu/miasta/państwa?

Jeśli używam pole kod ten łamie:

 String zipcode = address.zipcode(); 

Ale jeśli mogę użyć getter, to nie łamie:

 String zipcode = address.getZipcode(); 

JavaScript nie ma czegoś takiego JavaBeans. O ile przeczytałem, zamierzona wartość GET i SET jest ograniczona do wcześniejszych właściwości "syntetycznych" (obliczanych).

Ale to trochę lepsze niż java, ponieważ Java nie pozwala na kompatybilną konwersję "pola" do metody, pozwala na to ES6 GET i SET.

To znaczy, jeśli mam:

 var zipcode = address.zipcode; 

Jeśli zmienić kod pocztowy od bycia średnia własność obiektu do getter, powyższy kod teraz wywołuje funkcję GET.

Należy zauważyć, że jeśli nie uwzględniłem GET w definicji, NIE spowoduje to wywołania metody GET kodu zip. Zamiast tego po prostu przypisze kod funkcji do var.

Sądzę, że są to ważne rozróżnienia, które można zrozumieć między różnymi metodami ustawiania i ustawiania języka Java i JavaScript ES6.

Powiązane problemy