2013-04-28 15 views
5
var o, d; 

o = { get foo() { return 17; } }; 
d = Object.getOwnPropertyDescriptor(o, "foo"); 
// d is { configurable: true, enumerable: true, get: /*the getter function*/, set:  undefined } 

Co robi ten obiekt get w obiekcie? Czy to jest metoda lub własność, czy coś innego? Jak to działa lub jak ustawić właściwość lub metodę do obiektu? Czy popadnę w kłopoty, jeśli po prostu zignoruję użycie get i set? Czy są więcej korzyści z używania get i set niż proste definiowanie właściwości bez użycia. Jakie są zalety tej metody? Jeśli zwraca obiekt, czy mogę po prostu zrobić returnedobj.configurable, aby uzyskać dostęp do konfigurowalnej wartości właściwości?Tworzenie właściwości w obiekcie literalnym

Odpowiedz

4

Parametr get definiuje funkcję dostępu do właściwości : . Gdy wartość nieruchomości foo na o są pobierane, że funkcja jest wywoływana mimo że nie wygląda jak wywołania funkcji w kodzie, np:

var a = o.foo; // Note that `foo` doesn't have() after it, it's not a function call 

W tym przypadku, to zawsze zwraca 17, ale zamiast tego może zrobić coś innego. Na przykład, rozważmy koło:

var circle = { 
    radius: 7, 
    get circumference() { return 2 * Math.PI * this.radius; }, 
    get area()   { return Math.PI * this.radius * this.radius; } 
}; 
console.log(circle.circumference); // 43.982297150257104 
console.log(circle.area);   // 153.93804002589985 
circle.radius = 4; 
console.log(circle.circumference); // 25.132741228718345 
console.log(circle.area);   // 50.26548245743669 

Jak widać, gdy mamy dostęp do dwóch właściwości określiliśmy z akcesorów, funkcje przypisane do nich się nazywa, chociaż dostęp nieruchomość nie wygląda funkcji połączenie.

Możesz także mieć funkcje, które zostaną wywołane, gdy właściwość jest ustawiona jako. Nic dziwnego, że robisz to za pomocą set zamiast get. :-)

Możesz przeczytać więcej na ten temat w części dotyczącej specyfikacji object initializers i on MDN.

Wywołanie zwraca obiekt, który opisuje żądaną właściwość (w tym przypadku foo). Możesz również przeczytać więcej na ten temat: in the spec i on MDN.

Cytowanie z MDN:

Deskryptor właściwość jest płyta (TJC: np, Przedmiotem) niektóre z następujących cech:

value
wartości związanej z obiektem (deskryptorów danych). writable true wtedy i tylko wtedy, gdy wartość związana z właściwością może zostać zmieniona (tylko deskryptory danych).
get
Funkcja, która służy jako getter dla nieruchomości, lub undefined, jeśli nie ma żadnego gettera (tylko deskryptory akcesoriów).
set
Funkcja służąca jako narzędzie ustawiające właściwość, lub undefined, jeśli nie ma programu ustawiającego (tylko deskryptory akcesoriów).
configurable true wtedy i tylko wtedy, gdy typ tego deskryptora właściwości może zostać zmieniony i właściwość może zostać usunięta z odpowiedniego obiektu.
enumerable true wtedy i tylko wtedy, gdy ta właściwość pojawia się podczas wyliczania właściwości na odpowiednim obiekcie.

+0

Czy ta ostatnia opieka mogłaby się podzielić, dlaczego jest to "nieprzydatne"? –

+1

Wygląda na to, o ile wiem. +1 –

2

get jest częścią składni ECMAScript 5 do definiowania właściwości pobierających i ustawiających.

Korzystanie składni dosłownego obiekt, jest zdefiniowana następująco:

var obj = { 
    __other_property__: null, 
    get foo() { return "bar"; }, 
    set foo(v) { this.__other_property__ = v } 
}; 

pozwala to wywołać ciało funkcji pochłaniacza, gdy robi się na posesji.

obj.foo = "oof"; 
console.log(obj.foo); // "bar" 
console.log(obj.__other_property__); // "oof" 

powyższych zastosowań foo ustawić różne właściwości __other_property__. Może to być zmienna lokalna lub coś innego, a funkcje mogą oczywiście wykonywać znacznie bardziej skomplikowane operacje, niż tutaj pokazuję.

+0

podziękowania u.what o kolejnej części sir zapytania –

+0

@Maizere: Tak, to zwraca obiekt o właściwościach dostępnych. Pomyślałem, że znajdziesz to, kiedy spróbujesz. –

+0

Obawiałem się spróbować, tak czy inaczej, dziękuję. Również możesz mi pomóc, co robi "zestaw"? czy funkcja zostanie wywołana, gdy ustawimy wartość –

Powiązane problemy