2013-08-26 9 views
5

Jakiś czas temu usłyszałem, że dobrą praktyką jest zawijanie kodu w duży obiekt, aby służyć jako przestrzeń nazw w celu zmniejszenia zaśmiecania globalnej przestrzeni nazw i ułatwienia eksportu biblioteki, więc spróbowałem tego .Wywołanie metod składowych przed zakończeniem deklaracji obiektu

var wrapper = { 
    foo: function(){ 
     return 42; 
    }, 
    bar: this.foo() 
}; 

Zawodzi, twierdząc, że "foo nie jest zdefiniowane". Metody wywoływania przed zakończeniem deklaracji obiektu są prawdopodobnie złe, więc przesunąłem pasek i zadziałało.

var wrapper = { 
    foo: function(){ 
     return 42; 
    }, 
}; 
wrapper.bar = wrapper.foo(); 

czuję, że to może stać się rodzajem brzydkie, zwłaszcza z zagnieżdżonych nazw i takich, więc czy są jakieś obejścia, które nie sprawiają, że trudno, aby zobaczyć wszystkich członków owijki za naraz?

+0

Dlaczego trzeba zadzwonić każdy metoda przy deklaracji? Może chcesz użyć funkcji natychmiast wywoływanej (* IEFE *). Sprawdź także * wzorzec modułu *. – Bergi

Odpowiedz

1

Problem polega na tym, że this będzie równać się z kontekstem globalnym. Trzeba wejść w funkcję tak:

var wrapper = { 
    foo: function(){ 
     return 42; 
    }, 
    bar: null, 
    init : function() { 
     // all initialization code goes here 
     wrapper.bar = wrapper.foo(); 
    } 
}; 

wrapper.init(); 

Ta metoda doskonale nadaje się do organizowania kodu na logiczne części, dzięki czemu można i przyszłych programistów łatwością szukasz w JavaScript.

+0

Hm, Chrome twierdzi, że "Nie można wywołać metody" foo "z undefined", co oznacza, że ​​opakowanie jest niezdefiniowane? –

+0

Zaktualizowany kod do użycia. Najczęstszym zastosowaniem tej architektury jest włączenie funkcji init, która wykonuje wszystkie inicjalizacje zmiennych. Można to zrobić w zdarzeniu onload dokumentu w przypadku, gdy zmienne będą zawierały odniesienia do DOM, tj .: 'wrapper.bar = document.getElementById ('bar');' co jest przydatne, gdy chcesz ograniczyć liczbę razy szukasz DOM –

0

Korzystanie this takiego nie będzie działać, jeśli wrapper jest 1) funkcję, i 2), które oznacz ją z niego korzystać:

var wrapper = function() { 
    this.foo = function() { return 42; } 
    this.bar = this.foo(); 
}; 

var wrapperInstance = new wrapper(); 
alert(wrapperInstance.bar()); // 42 
wrapperInstance.foo(); // also works 
+0

Zakładam, że chodziło o 'alert (wrapperInstance.bar); wrapperInstance.foo(); ', biorąc pod uwagę, że pasek nie jest funkcją i że opakowanie nie ma członków. To również wydaje się przesadne w przypadku wrappera, ponieważ tworzenie konstruktora, którego będziesz używać tylko raz wydaje się głupie ... –

+0

Tak, poszedłem do przodu i odpowiednio go zredagowałem. To nie jest głupie - pomyślcie o singletowym wzorze. :) –