2011-08-05 12 views
5

jaka jest najlepsza praktyka, aby z nich korzystać?Javascript dosłowny a funkcja oop

var x = { a: 'a', eat: function() { }, ... } 

vs

var x = function() { var a = 'a'; this.eat = function() { }} 

powyższe musi być zainicjowany:

new x(); 

może ktoś mi pomóc wyjaśnić znaczenie tych dwóch, a który jest preferowanym wyborem wśród społeczności oop ? każde słowo mądrości mogłoby pomóc. Zrobiłem też trochę badań, ale nic nie wyszło. wiele myśli jest doceniane.

Odpowiedz

4

Podstawowa różnica polega na tym, że pierwsza wersja eksponuje zmienną "a", a druga ją ukrywa. Więc jeśli nie chcesz lub potrzebujesz kodu klienta, aby uzyskać dostęp do x.a, preferowana jest druga wersja.

Trzecim podejściem byłoby użycie prototypu. W tym przypadku zmienna lokalna w konstruktorze nie będzie Pan wiele dobrego, więc jeśli eat() potrzebuje dostępu do a, następnie chcesz napisać:

function x() { 
    this.a = 'a'; 
} 

x.prototype.eat = function() { 
    // do stuff with this.a 
} 

w tym przypadku, każde wystąpienie ma nową kopię a, ale istnieje tylko jedna kopia eat. Wadą (jeśli tak uważasz) jest to, że a jest dostępny dla użytkowników instancji x.

+0

Jednak druga wersja nie zezwala na użycie [[prototypu]] (którego 1 * można * w prosty sposób przekonwertować na) - z drugim podejściem każdy "zjedz" będzie dla niego nowym obiektem funkcyjnym z nową oprawą [[łańcuch zasięgu]]. Generalnie wolę używać [[prototyp]]. –

+0

tak, ale zawsze może zrobić 'var x = (function() {var a = 'a'; return {eat: function() {}};}());' –

+0

możesz podać przykład prototyp będzie wyglądał? –

3

Pierwsza z nich po prostu utworzy pojedynczy obiekt, którego nie można użyć ze słowem kluczowym new. Drugi zawiera lokalną zmienną, zamiast tworzyć właściwość podobną do pierwszej.

Funkcje są zazwyczaj pisane jako nazwanych funkcji zamiast funkcji anonimowych przypisanych zmiennych:

function x() { 
    this.a = 'a'; 
    this.eat = function() {}; 
} 

Teraz można tworzyć obiekty używając go:

var y = new x(); 

Innym sposobem metod określających dla obiektu jest umieścić go w prototypie:

function x() { 
    this.a = 'a'; 
} 

x.prototype.eat = function() {}; 
+0

W rzeczywistości "anonimowe funkcje przypisane do zmiennych" nazywa się wyrażeniem funkcji i jest dość powszechne. –

+0

@Bradley Staples: Nie, wyrażenie funkcji * nie jest funkcją anonimową przypisaną do zmiennej *, funkcja anonimowa jest jedną z form wyrażeń funkcyjnych, więc anonimowa funkcja przypisana do zmiennej * jest jedną z postaci * wyrażenie funkcji przypisane do zmiennej *. Chociaż jest to dość powszechne, nazwane funkcje są bardziej powszechne. – Guffa

2

Generalnie rzecz biorąc opowiadaj o tym, co próbujesz zdobyć. Pamiętaj, że JS nie ma prawdziwych klas, języka opartego na prototypach. Operator new jest dość mylący.

Sugerowałbym używanie dosłownie: {}, gdy tylko jest to możliwe. Na przykład można to zrobić tak:

var myconstr = function(param){ 
    var pr = 'some private var'; 
    return { 
     a : param, 
     get2a : function(){ return this.a; } 
    }; 
}; 

Jeśli chcesz tylko jedno wystąpienie, możesz zawsze wywołać tę funkcję tuż po jej zdefiniowaniu.

ALE jeśli chcesz użyć , może być łatwiej z funkcją Budowanie - ale nadal, nie użyłbym nowego operatora, jak jest, może zawijanie go w jakiejś innej funkcji byłoby lepsze.