Zgodnie z instrukcją Node.js:
Jeśli chcesz, aby korzeniem eksportu modułu była funkcja (taka jak konstruktor) lub jeśli chcesz wyeksportować cały obiekt w jednym przypisaniu, zamiast budować go po jednej właściwości na raz, przypisz go do module.exports zamiast eksportu .
Podany przykład to:
// file: square.js
module.exports = function(width) {
return {
area: function() {
return width * width;
}
};
}
i używane w ten sposób:
var square = require('./square.js');
var mySquare = square(2);
console.log('The area of my square is ' + mySquare.area());
Moje pytanie: dlaczego w przykładzie nie użyto kwadratu jako obiektu? Czy poniższe informacje są poprawne i czy sprawiają, że przykład jest bardziej „zorientowany obiektowo”?
var Square = require('./square.js');
var mySquare = new Square(2);
console.log('The area of my square is ' + mySquare.area());
javascript
node.js
commonjs
Naresh
źródło
źródło
square
na już nie istnieje.Square
new square()
Odpowiedzi:
Moduły CommonJS pozwalają na dwa sposoby definiowania eksportowanych właściwości. W obu przypadkach zwracasz obiekt / funkcję. Ponieważ funkcje są obywatelami pierwszej klasy w JavaScript, mogą zachowywać się jak obiekty (technicznie rzecz biorąc, są to obiekty). To mówi twoje pytanie dotyczące używania
new
słów kluczowych ma prostą odpowiedź: Tak. Zilustruję ...Eksport modułów
Możesz użyć
exports
podanej zmiennej, aby dołączyć do niej właściwości. Gdy będą wymagane w innym module, te przypisane właściwości stają się dostępne. Lub możesz przypisać obiekt do właściwości module.exports. W obu przypadkach to, co jest zwracane przez,require()
jest odniesieniem do wartościmodule.exports
.Przykład pseudokodu pokazujący, jak zdefiniowano moduł:
W powyższym przykładzie
module.exports
iexports
są tym samym obiektem. Fajne jest to, że nie widzisz nic z tego w swoich modułach CommonJS, ponieważ cały system dba o to za Ciebie.Wszystko, co musisz wiedzieć, jest to, że istnieje obiekt modułu z właściwością eksportu i zmienną eksportu, która wskazuje na to samo robi module.exports.Wymagaj z konstruktorami
Ponieważ możesz dołączyć funkcję bezpośrednio do
module.exports
, możesz w zasadzie zwrócić funkcję i jak każda funkcja może być zarządzana jako konstruktor (to jest napisane kursywą, ponieważ jedyną różnicą między funkcją a konstruktorem w JavaScript jest sposób jej użycia. nie ma różnicy.)A więc poniższy kod jest bardzo dobry i osobiście do tego zachęcam:
Wymagaj dla nie-konstruktorów
To samo dotyczy funkcji niebędących konstruktorami:
źródło
Moim zdaniem niektóre przykłady node.js są dość wymyślne.
Możesz spodziewać się czegoś podobnego w prawdziwym świecie
Stosowanie
Dla ludzi z ES6
Używanie go w ES6
Korzystając z klasy, musisz użyć
new
słowa kluczowego, aby ją zainicjować. Wszystko inne pozostaje takie samo.źródło
new
a nieużywaniem. Ale czy to tylko dlatego, że masz ten czekthis instanceof square
? Jeśli tak, co dokładnie robi ten mechanizm?import
iexport
zdefiniowane? Są to zastrzeżone słowa kluczowe w ECMAScript 6 (ES6). Przed ES6 trzeba było używać bibliotek do zarządzania modułami. Modulowanie węzła jest wzorowane na modułach biblioteki CommonJS. Co jestdefault
wexport default Square
środku? Określa to, co zaimportować po prostu zaimportować „plik”, a nie inne, konkretne eksporty z tego pliku. Dopóki istnieją, przydały mi się te strony: spring.io/understanding/javascript-modules and exploringjs.com/es6/ch_modules.htmlTo pytanie tak naprawdę nie ma nic wspólnego z tym, jak
require()
działa. Zasadniczo wszystko, co ustawiszmodule.exports
w swoim module, zostanie zwrócone zrequire()
wezwania do tego.Byłoby to równoważne z:
Nie ma potrzeby używania
new
słowa kluczowego podczas dzwonieniasquare
. Nie zwracasz samej instancji funkcji zsquare
, na końcu zwracasz nowy obiekt. Dlatego możesz po prostu wywołać tę funkcję bezpośrednio.Aby
new
zapoznać się z bardziej zawiłymi argumentami , zobacz: Czy „nowe” słowo kluczowe JavaScript jest uważane za szkodliwe?źródło
new
aby inni mogli tam uczestniczyć w wojnie.Przykładowy kod to:
w głównej
Korzystanie z następujących może działać
źródło
Na koniec Node dotyczy Javascript. JS ma kilka sposobów, aby coś osiągnąć, otrzymanie „konstruktora” jest tym samym, ważne jest zwrócenie funkcji .
W ten sposób faktycznie tworzysz nową funkcję, tak jak stworzyliśmy na przykład za pomocą JS w środowisku przeglądarki internetowej.
Osobiście wolę podejście prototypowe, jak sugerowała Sukima w tym poście: Node.js - użycie module.exports jako konstruktora
źródło