Próbowałem poradzić sobie z metodami pobierającymi i ustawiającymi, ale to nie zagłębia się. Przeczytałem JavaScript Getters and Setters i Defining Getters and Setters i po prostu nie rozumiem .
Czy ktoś może jasno stwierdzić:
- Co getter i setter mają zrobić i
- Podaj BARDZO proste przykłady?
javascript
setter
getter
Alexander Abakumov
źródło
źródło
a = setValue(5);
go,a = 5;
asetValue()
tym samym zostać wezwanym pod maskę, aby robić, co chcesz.Odpowiedzi:
Oprócz odpowiedzi @ millimoose, metody ustawiające mogą być również używane do aktualizowania innych wartości.
Teraz można ustawić
fullName
, afirst
ilast
będzie aktualizowany i vice versa.źródło
Object.defineProperty
funkcję, która może definiować metody pobierające i ustawiające.this.__defineGetter__
lub nowszejObject.defineProperty
funkcji.Name.prototype.constructor
? Wydaje się, że to zła alternatywa dla odpowiedzi millimoose'a .Metody pobierające i ustawiające w JavaScript
Przegląd
Pobierające i ustawiające w JavaScript są wykorzystywane do definiowania obliczonych właściwości lub akcesorów . Właściwość obliczona to taka, która używa funkcji do pobrania lub ustawienia wartości obiektu. Podstawowa teoria robi coś takiego:
Jest to przydatne do automatycznego wykonywania czynności za kulisami, gdy uzyskuje się dostęp do właściwości, takich jak utrzymywanie liczb w zakresie, ponowne formatowanie łańcuchów, wyzwalanie zdarzeń spowodowanych zmianą wartości, aktualizowanie danych relacyjnych, zapewnianie dostępu do właściwości prywatnych i nie tylko.
Poniższe przykłady pokazują podstawową składnię, chociaż po prostu pobierają i ustawiają wewnętrzną wartość obiektu, nie robiąc nic specjalnego. W rzeczywistych przypadkach zmodyfikowałbyś wartość wejściową i / lub wyjściową, aby dopasować ją do swoich potrzeb, jak wspomniano powyżej.
pobierz / ustaw słowa kluczowe
ECMAScript 5 obsługuje
get
iset
słowa kluczowe do definiowania obliczonych właściwości. Działają ze wszystkimi nowoczesnymi przeglądarkami z wyjątkiem IE 8 i starszych.Niestandardowe metody pobierające i ustawiające
get
iset
nie są słowami zastrzeżonymi, więc można je przeciążać w celu tworzenia własnych niestandardowych funkcji obliczanych właściwości w różnych przeglądarkach. To zadziała w każdej przeglądarce.Lub dla bardziej zwartego podejścia, można użyć pojedynczej funkcji.
Unikaj robienia czegoś takiego, co może prowadzić do rozdęcia kodu.
W powyższych przykładach nazwy właściwości wewnętrznych są wyabstrahowane podkreśleniem, aby zniechęcić użytkowników do prostego działania
foo.bar
vs.foo.get( 'bar' )
i uzyskiwania wartości „niegotowanej”. Możesz użyć kodu warunkowego, aby wykonać różne czynności w zależności od nazwy właściwości, do której uzyskujesz dostęp (za pośrednictwemname
parametru).Object.defineProperty ()
Użycie
Object.defineProperty()
jest innym sposobem dodawania metod pobierających i ustawiających i może być używane na obiektach po ich zdefiniowaniu. Może być również używany do ustawiania konfigurowalnych i wyliczalnych zachowań. Ta składnia działa również z IE 8, ale niestety tylko w przypadku obiektów DOM.__defineGetter __ ()
Wreszcie
__defineGetter__()
jest inna opcja. Jest przestarzały, ale nadal jest szeroko stosowany w sieci, więc prawdopodobnie nie zniknie w najbliższym czasie. Działa na wszystkich przeglądarkach oprócz IE 10 i starszych. Chociaż inne opcje działają również dobrze w wersji innej niż IE, więc ta nie jest tak przydatna.Warto również zauważyć, że w tych ostatnich przykładach nazwy wewnętrzne muszą być inne niż nazwy akcesorów, aby uniknąć rekursji (tj.
foo.bar
Wywoływaniefoo.get(bar)
wywoływaniafoo.bar
wywoływaniafoo.get(bar)
...).Zobacz też
MDN get , set , Object.defineProperty () , __defineGetter __ () , __defineSetter __ () Obsługa
MSDN IE8 Getter
źródło
this[ '_' + name ] = value;
może byćthis[ '_' + name ] = arguments[1];
i nie będzie potrzeby, aby określićvalue
arg.var foo = { bar : 123, get bar(){ return bar; }, set bar( value ){ this.bar = value; } }; foo.bar = 456;
Zgłasza wyjątek: Uncaught RangeError: Przekroczono maksymalny rozmiar stosu wywołań na pasku Object.set [as bar] (<anonymous>: 4: 32) at Object.set bar [as bar] (<anonymous>: 4: 32 ) w Object.set bar [as bar] (<anonymous>: 4: 32) at Object.set bar [as bar] (<anonymous>: 4: 32) at Object.set bar [as bar] (<anonymous> : 4:32) na pasku Object.set [as bar] (<anonymous>:bar: 123
ithis.bar = value
itp. Zmień je_bar
na przykład. Zobacz: hongkiat.com/blog/getters-setters-javascript_foo
lubmFoo
. Jeśli jest to to samo co getter / setter, spowoduje to nieskończoną pętlę z powodu rekursji, a następnie Stack Overflow ™ ;-), ponieważ kiedy powiesz a = b, wywoła a.get (b), które samo wywołuje a = b , która wywołuje a.get (b), ...Używałbyś ich na przykład do implementacji obliczonych właściwości.
Na przykład:
(CodePen)
źródło
Object.defineProperties
.Przepraszam, że wskrzeszam stare pytanie, ale pomyślałem, że mogę wnieść kilka bardzo podstawowych przykładów i wyjaśnień dla manekinów. Żadna z pozostałych odpowiedzi opublikowanych w ten sposób nie ilustruje składni tak jak pierwszy przykład z przewodnika MDN , który jest tak prosty, jak tylko można.
Rębacz:
... będzie się logować
John Smith
oczywiście się . Funkcja pobierająca zachowuje się jak zmienna właściwość obiektu, ale zapewnia elastyczność funkcji do obliczania zwracanej wartości w locie. Jest to po prostu fantazyjny sposób tworzenia funkcji, która nie wymaga () podczas wywoływania.Seter:
... będzie się logować
New York
się do konsoli. Podobnie jak metody pobierające, metody ustawiające są wywoływane z taką samą składnią, jak ustawianie wartości właściwości obiektu, ale są kolejnym wymyślnym sposobem wywołania funkcji bez ().Zobacz ten plik jsfiddle, aby uzyskać dokładniejszy, być może bardziej praktyczny przykład. Przekazywanie wartości do metody ustawiającej obiekt wyzwala tworzenie lub zapełnianie innych elementów obiektu. W szczególności, w przykładzie z jsfiddle, przekazanie tablicy liczb skłania ustawiającego do obliczenia średniej, mediany, trybu i zakresu; następnie ustawia właściwości obiektu dla każdego wyniku.
źródło
maps.roll
jako właściwości, a nie wartościmaps.roll()
zwrotu. To tylko preferencja.maps.roll()
Metody pobierające i ustawiające mają sens tylko wtedy, gdy masz prywatne właściwości klas. Ponieważ Javascript tak naprawdę nie ma właściwości klasy prywatnej, jak normalnie myślisz w językach obiektowych, może być trudny do zrozumienia. Oto jeden przykład prywatnego obiektu licznika. Zaletą tego obiektu jest to, że do zmiennej wewnętrznej „count” nie można uzyskać dostępu z zewnątrz obiektu.
Jeśli nadal jesteś zdezorientowany, zapoznaj się z artykułem Crockforda na temat prywatnych członków w Javascript .
źródło
var baz = foo.bar
się, że kryje się za tym pełny zestaw ukrytych zachowań. I byłoby oczekiwać, że odfoo.getBar()
krytyki.Wydaje mi się, że pierwszy artykuł, do którego odsyłasz, stwierdza to dość jasno:
Celem jest tutaj hermetyzacja i abstrakcja pól, umożliwiając dostęp do nich tylko za pomocą metody
get()
lubset()
. W ten sposób możesz przechowywać pole / dane wewnętrznie w dowolny sposób, ale zewnętrzne komponenty są tylko z dala od opublikowanego interfejsu. Pozwala to na dokonywanie zmian wewnętrznych bez zmiany zewnętrznych interfejsów, dokonywanie walidacji lub sprawdzania błędów wset()
metodzie itp.źródło
Chociaż często jesteśmy przyzwyczajeni do oglądania obiektów z właściwościami publicznymi bez żadnej kontroli dostępu, JavaScript pozwala nam dokładnie opisać właściwości. W rzeczywistości możemy użyć deskryptorów, aby kontrolować, w jaki sposób można uzyskać dostęp do właściwości i jaką logikę możemy do niej zastosować. Rozważmy następujący przykład:
Wynik końcowy:
źródło
Co w tym jest tak mylącego… metody pobierające to funkcje, które są wywoływane, gdy otrzymujesz właściwość, czyli ustawiacze, gdy ją ustawisz. na przykład, jeśli tak
Ustawiasz właściwość właściwości, jeśli używasz metod pobierających / ustawiających, zostanie wywołana funkcja ustawiająca z „abc” jako argumentem. Definicja funkcji ustawiającej wewnątrz obiektu idealnie wyglądałaby mniej więcej tak:
Nie jestem pewien, jak dobrze jest to zaimplementowane w różnych przeglądarkach. Wygląda na to, że Firefox ma również alternatywną składnię, ze specjalnymi („magicznymi”) metodami z podwójnym podkreśleniem. Jak zwykle Internet Explorer nie obsługuje tego.
źródło
Możesz zdefiniować metodę instancji dla klasy js, poprzez prototyp konstruktora.
Poniżej znajduje się przykładowy kod:
Powinno to działać dla każdej przeglądarki, możesz też po prostu użyć nodejs do uruchomienia tego kodu.
źródło
Byłem również nieco zdezorientowany wyjaśnieniem, które przeczytałem , ponieważ próbowałem dodać właściwość do istniejącego prototypu, którego nie napisałem, więc zastąpienie prototypu wydawało się złym podejściem. Tak więc, dla potomności, oto jak dodałem
last
właściwość doArray
:Nieco ładniejsze niż dodanie funkcji IMHO.
źródło
Jeśli odnosisz się do koncepcji akcesorów, prostym celem jest ukrycie podstawowej pamięci masowej przed dowolną manipulacją. Najbardziej ekstremalnym mechanizmem jest to
Jeśli odnosisz się do rzeczywistej funkcji getter / setter JS, np.
defineGetter
/defineSetter
lub{ get Foo() { /* code */ } }
, wtedy warto zauważyć, że w większości nowoczesnych silników późniejsze wykorzystanie tych właściwości będzie znacznie wolniejsze niż w innym przypadku. na przykład. porównaj wydajnośćvs.
źródło
Mam dla was jeden, który może być trochę brzydki, ale działa na różnych platformach
w ten sposób, kiedy dzwonisz
Jeśli naprawdę chcesz coś urozmaicić ... możesz wstawić rodzaj czeku:
lub jeszcze bardziej szalony dzięki zaawansowanemu kodowi typu check: type.of () na stronie codingforums.com
źródło