2011-08-02 14 views
19

Dla mnie klasy są dość podobne do modułów NodeJS (CommonJS). Możesz mieć wiele z nich, mogą być ponownie użyte, mogą używać siebie nawzajem i generalnie są one w jednym pliku.Moduły NodeJS kontra klasy

Co sprawia, że ​​moduły tak różnią się od klas? Sposób ich używania różni się, a różnica w przestrzeni nazw jest oczywista. Poza tym wydają mi się bardzo podobne do mnie, a może po prostu nie widzę oczywistych korzyści tutaj.

+0

Intryguje mnie benchmark na serwerze node.js - moduły commonjs a klasy ECMAScript 6 –

Odpowiedz

21

Moduły są bardziej podobne do pakietów (do używania terminologii Java) niż klasy. Nie tworzysz instancji modułu; jest tylko jedna kopia tego. Jest to narzędzie do organizowania powiązanych funkcji, ale zazwyczaj nie zawiera danych konkretnej instancji obiektu.

Prawdopodobnie najbliższy odpowiednik klasy (odkładając na bok te biblioteki, które faktycznie tworzą dziedziczenie klasowe w JavaScript) jest po prostu funkcją konstruktora. Oczywiście możesz umieścić takie funkcje wewnątrz modułu.

function Car() { 
    this.colour = 'red'; 
} 
Car.prototype.getColour = function() { return this.colour; }; 

var myCar = new Car(); 
myCar.getColour(); // returns 'red' 

Używasz obu modułów i klas do enkapsulacji, ale natura tej enkapsulacji jest inna.

0

Jedna ważna rzecz; że "ogólnie rzecz biorąc jeden plik" nie jest prawdą; moduły są absolutnie jedno na plik. A require(), który wprowadza moduł exports do przestrzeni nazw, nie ma możliwości rozróżnienia między wyeksportowaną treścią tego modułu; wszystko, co eksportuje moduł (plik), jest importowane za pomocą instrukcji require(). Próba umieszczenia więcej niż jednego modułu w pliku oznacza, że ​​wszystko będzie w tym pliku, gdy spróbujesz załadować moduł "albo".

1

JS był początkowo prototypowym systemem dziedziczenia. To było bardzo proste, jak reszta języka. Ale Netscape zdecydował, że będzie bardziej podobny do Javy i dodał pomysł konstruktorów do tego języka. Tak narodziły się pseudoklasie. Możesz sprawdzić ten link, aby dowiedzieć się, jak prototypowe OOP jest używane w JS: http://howtonode.org/prototypical-inheritance