2009-07-17 10 views
8

W języku Javascript OO, kiedy należy użyć słowa kluczowego this?Kiedy użyć tego w javascript OO?

Ponadto, jeśli chcę wywołać metodę klasy z innej metody tej samej klasy, należy użyć this lub po prostu nazwę funkcji? E.g to jest poprawne?

function Foo() 
{ 
    this.bar= function() 
    { 
     alert('bar'); 
    } 

    this.baz= function() 
    { 
    this.bar(); //should I use this.bar() or just bar()? 
    } 
} 
+1

nie można użyć po prostu 'bar()' bo 'this' nigdy nie jest ukryte w JavaScript (ponieważ to naprawdę nie jest właściwy język zorientowany obiektowo.)' Bar() 'najpierw spojrzeć dla zmiennej zdefiniowanej jako 'bar' w funkcji' this.baz', wówczas szukałaby zmiennej zdefiniowanej jako 'bar' w funkcji' Foo', a na końcu wyglądałaby w zasięgu globalnym, aw przeciwnym razie rzuć błąd. – Blixt

+1

Ważne jest, aby nauczyć się systemu prototypów JavaScript, więc jest to świetne pytanie. Ale gdybym miał zrobić duży program OO w JavaScript, użyłbym Joose.js lub Js.Class. – Nosredna

+0

Dlaczego zostało to odrzucone? –

Odpowiedz

6

Jeśli chodzi o JavaScript "zorientowany obiektowo", oto ładny przewodnik Mark Dickinson tutaj na SO z linkami do: Private Members in JavaScript. Zawiera szczegółowe informacje na temat innych rzeczy, których teraz naprawdę nie potrzebujesz, ale gdy zrozumiesz, jak działa JavaScript, zobaczysz, że różni się on od zwykłego języka obiektowego, jeśli chodzi o rzeczy takie, jakimi naprawdę jest to, co oznacza this .

Powiedziałbym, że w twoim przypadku, powinno się używać this, ale może twoje funkcje powinny być w prototype część swojej „klasy” (pozwala to uniknąć redefinicji funkcję za każdym razem nowa instancja jest tworzony.)

+0

Zrobiłem prosty szablon dla klas, który wydaje się być bardzo podobny do tego, co Douglas Crawford ma w swoim artykule (który łączyłem). Jeśli spojrzenie na kod pomaga, zawsze możesz na to patrzeć: http://blixt.org/js /classes.js (plik raw) http://blixt.org/js#project/js-classes (z podświetleniem składni) – Blixt

+1

co rozumiesz przez "prototypową część klasy"? –

+1

Funkcje mają właściwość 'prototype', która jest używana jako prototyp dla obiektów utworzonych podczas wywoływania funkcji ze słowem kluczowym' new'. Jeśli ustawisz 'Foo.prototype.bar = function() {...};', to wszystkie obiekty utworzone za pomocą 'new Foo()' będą miały właściwość 'bar', która odwołuje się do funkcji' Foo.prototype.bar' . – Blixt

0

W tym konkretnym przypadku, to najlepiej użyć zmiennej własnym przedstawieniu w miejscu this uniknięcia nieporozumień i bóle głowy wewnątrz funkcji.

function Foo() 
{ 
    var self = this; 

    this.bar= function() 
    { 
     alert('bar'); 
    } 

    this.baz= function() 
    { 
    self.bar(); 
    } 
} 

Powodem to dlatego, ponieważ wszystko w javascript jest przedmiotem, this kluczowe wewnątrz funkcji odnosi się do funkcji nadrzędnej. Definiując zmienną w pewnym zakresie, gwarantowana zmienna zachowa swój zakres.

+0

Jakie są tego powody? –

+0

Robisz to, aby zakres był oczywisty. Wiele osób używa "tego" zamiast "siebie". – Nosredna

+0

Lub możesz zrobić to $. –

0

Wystarczy podkreślić i wczuć się w poprzednią odpowiedź @ tj111. Proponuję przeczytać this. Aby lepiej zrozumieć zakres funkcji.

0

Poprawna wersja to taka, która nie podaje błędu podczas próby wywołania funkcji. Jeśli pominiesz this, otrzymasz wyjątek od ReferenceError.

Powiązane problemy