2013-05-22 22 views
5

Poszerzanie informacji o tym answer Chciałbym wiedzieć, jak tworzyć nowe moduły należące do tej samej przestrzeni nazw (PROJEKT).Samouściowe moduły anonimowe JavaScript

A.init(); -- will become --> PROJECT.A.init(); 

Moduły

(function(A, $, undefined) { 
    A.init = function() { 
     console.log("A init"); 
    }; 
}(window.A = window.A || {}, jQuery)); 

(function(B, $, undefined) { 
    B.init = function() { 
     console.log("B init"); 
    }; 
}(window.B = window.B || {}, jQuery)); 

A.init(); 
B.init(); 

http://jsfiddle.net/sKBNA/

+0

Próbował pan coś? – Bergi

Odpowiedz

2

Wystarczy włożyć dodatkową przestrzeń nazw do łańcucha własności:

// create top namespace 
window.PROJECT = window.PROJECT || {}; 

// stays the same 
(function(A, $, undefined) { 
    A.init = function() { 
     console.log("A init"); 
    }; 
// except for the last line: 
}(window.PROJECT.A = window.PROJECT.A || {}, jQuery)); 

// same for the B (sub)namespace: 
(function(B, $, undefined) { 
    … 
}(window.PROJECT.B = window.PROJECT.B || {}, jQuery)); 

// and of course add it at the invocations: 
PROJECT.A.init(); 
PROJECT.B.init(); 
+0

Świetnie! Poza tym wywołanie powinno być PROJECT.A.init(); i PROJECT.B.init(); – howtodothis

1

Wystarczy dodać obiekt do globalnej przestrzeni nazw, przypisania obiektu literałów lub funkcje do tej przestrzeni nazw.

window.PROJECT = {}; 
(function($,window,undefined) { 
    var A = { 
     init : function() { ... } 
    } 
    window.PROJECT.A = A; 
})(jQuery, window); 
PROJECT.A.init(); 

Alternatywnie można po prostu zwrócić wartości z modułów do obiektu PROJECT.

window.PROJECT = {}; 
PROJECT.A = (function($, window, undefined) { 
    var A = { 
     init : function() { ... } 
    } 
    return A; 
})(jQuery,window); 

Ponownie, można po prostu zwrócić obiekt do zmiennej globalnej.

var PROJECT = (function($, window, undefined) { 
    var A = { 
     init : function() { ... } 
    } 
    var B = { 
     init : function() { ... } 
    } 
    return { A : A, B : B }; 
})(jQuery,window); 

Dodatkowe w oparciu o wcześniejszą odpowiedź wymienioną w PO, rozszerzającą obiekt o globalnym obiekcie nazw. Jest to faktycznie osiągnięte już w poprzedniej odpowiedzi.

var PROJECT = (function(window, undefined) { 
    // Private var 
    var container, 
    // Class constructor 
    Example = function() { 
    } 
    Example.prototype = { 
    }, 
    // Object literal 
    A = { 
     init : function() { 
      container = new Example(); 
     } 
     // Expose or reflect other methods using private instance of Example 
    } 
    return { A : A }; 
})(window); 

Aby przedłużyć PROJECT dalej zrobić jak poprzedni przykład wykazać

(function(window, PROJECT, undefined) { 
    // Private vars 
    ... 
    // Any other non exposed code 
    ... 
    PROJECT.B = { 
     init : function() { ... } 
    } 
    // Make sure PROJECT is attached to window if it is empty object 
    if (typeof window.PROJECT === 'undefined') 
     window.PROJECT = PROJECT; 
})(window, window.PROJECT || {});