2011-07-26 17 views
27

Co to są funkcje __defineGetter__() i __defineSetter__() w prototypie każdego Object?Co to są funkcje __defineGetter __() i __defineSetter __()?

+8

[Nieaktualne] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineGetter) :-) – cwallenpoole

+1

To znaczy "stary" i "nie jest obecnie w użyciu"? –

+0

@DOtNET Ninja - "Stary, nie jest już obsługiwany i nie powinien być używany, ale wciąż tam jest, aby nie łamać kompatybilności z osobami, które już go używają". – vcsjones

Odpowiedz

12

Zobacz MDN docs here dla opisu i przykładowy kod:

getter jest metodą, która pobiera wartość konkretnej nieruchomości. Seter to metoda ustawiająca wartość określonej właściwości. Można zdefiniować obiekty pobierające i ustawiające na dowolnym predefiniowanym obiekcie głównym lub obiekcie zdefiniowanym przez użytkownika, który obsługuje dodawanie nowych właściwości.

Jak wspomniano w dokumentach (i przez @ cwallenpoole), funkcje __define[GS]etter__() są teraz przestarzałe. Jest dużo więcej szczegółów w this article. Wierzę, że funkcja defineProperty() jest teraz preferowaną składnią.

8

Aby odpowiedzieć na pytanie __defineGetter__() i __defineSetter__() są starymi/oryginalnymi metodami tworzenia gettera i setera dla właściwości obiektu. Pozwalają one używać właściwości obiektu jako pary nazwa/wartość, podczas gdy za kulisami te pary nazwa/wartość są obsługiwane przez funkcje.

Załóżmy na przykład, że chcesz odnieść się do niektórych liczb losowych w ustalonych zakresach. Możesz wyrazić je jako słowa o maksymalnym zakresie i będzie wyglądać jak własność.

var random = {}; 
random.__defineGetter__('ten', function() { 
    return Math.floor(Math.random()*10); }); 
random.__defineGetter__('hundred', function() { 
    return Math.floor(Math.random()*100); }); 

Pamiętaj, że chociaż powyższy przykład odpowiada na pytanie, nie powinieneś używać tego rozwiązania. Zamiast tego należy użyć nowoczesną formę pobierające i ustawiające od ES5:

var random = { 
    get ten() { return Math.floor(Math.random()*10); }, 
    get hundred() { return Math.floor(Math.random()*100); } 
}; 

jedną z powyższych konstruktów pozwoli Ci uzyskać liczbę losową takiego:

var myrand = random.ten; 
// returns a result in the range 0 to 9 
+0

Czy nie mogę zrobić tego samego z funkcją, to jakie jest konkretne użycie gettera i setera? –

+0

Tak, możesz. Mój przykład nie był świetny, ponieważ pokazuje jedynie użycie geterów i ustawiaczy. Zwykle program pobierający i ustawiający będzie wspierany przez zmienną i/lub większą funkcjonalność obliczeniową. Na przykład, jeśli masz obiekt o nazwie Temperatura, możesz mieć właściwość C i F, które zwracają temperatury w C lub F. Nie są to w rzeczywistości właściwości, ale są metodami (pobierającymi), które konwertują między wartością podstawową trzymaną w obiekcie. Albo jeden z nich może być własnością, a drugi zyskiem, który dokonuje konwersji. – Guy