2012-02-01 16 views
10

Trochę się staram, aby jak najlepiej wykorzystać moduł węzła/require()/exports skonfigurować, aby wykonać właściwe programowanie OO. Czy dobrą praktyką jest tworzenie globalnej przestrzeni nazw i nie używanie eksportu (jak w przypadku tworzenia aplikacji js po stronie klienta)? Tak więc, w module (Namespace.Constructor.js):Wyznaczanie nazw Node.js

Namespace = Namespace || {}; 
Namespace.Constructor = function() { 
    //initialise 
} 
Namespace.Constructor.prototype.publicMethod = function() { 
    // blah blah 
} 

... i nazywając plik wystarczy użyć ...

requires('Namespace.Constructor'); 
var object = new Namespace.Constructor(); 
object.publicMethod(); 

Dzięki

+3

użyć 'exports' lub' module.exports'. Twój moduł jest już podany w nazwach. Po prostu wykonaj [tych dokumentów] (http://nodejs.org/docs/latest/api/modules.html). – nicerobot

Odpowiedz

16

W node.js, moduł location to przestrzeń nazw, więc nie ma potrzeby przestrzeni nazw w kodzie, jak opisałeś. Sądzę, że są z tym pewne problemy, ale można nimi zarządzać. Węzeł będzie wystawiał tylko kod i dane, które dołączasz do obiektu module.exports.

W przykładzie użyć następujących:

var Constructor = function() { 
    // initialize 
} 
Constructor.prototype.publicMethod = function() {} 
module.exports = Constructor; 

a następnie w kodzie wywołującego:

var Constructor = require('./path/to/constructor.js'); 
var object = new Constructor(); 
object.publicMethod(); 
+1

Ale jeśli nie użyjemy var, zostanie utworzony globalny i będzie dostępny dla osoby dzwoniącej. Dlaczego więc musimy w ogóle korzystać z eksportu? – hacklikecrack

+1

Aby uniknąć kolizji nazw w przestrzeni globalnej. Oczywiście możesz stworzyć własny system przestrzeni nazw, ale require() działa rozsądnie i jest jasnym standardem w rozwoju node.js. –

+7

hacklikecrack: Brak parametru var w module nie tworzy globalnej wartości, która jest dostępna dla wywołującego. Węzeł automatycznie opakowuje twój kod modułu w funkcję, aby temu zapobiec. –

Powiązane problemy