Node.js – Verwendung von module.exports als Konstruktor
Lesezeit: 4 Minuten
Naresh
Laut dem Node.js-Handbuch:
Wenn Sie möchten, dass die Wurzel des Exports Ihres Moduls eine Funktion (z. B. ein Konstruktor) ist oder wenn Sie ein vollständiges Objekt in einer Zuweisung exportieren möchten, anstatt es einzeln zu erstellen, weisen Sie es module.exports statt exports zu .
var square = require('./square.js');
var mySquare = square(2);
console.log('The area of my square is ' + mySquare.area());
Meine Frage: Warum verwendet das Beispiel kein Quadrat als Objekt? Ist das Folgende gültig und macht es das Beispiel “objektorientierter”?
var Square = require('./square.js');
var mySquare = new Square(2);
console.log('The area of my square is ' + mySquare.area());
Ihr Beispiel ist ein Syntaxfehler. Nach Umbenennung square zu Square das new square() existiert nicht mehr.
– Sukima
12. Dezember 2013 um 3:57 Uhr
Entschuldigung, das war ein Tippfehler. Behoben. Meine Absicht war es, den Objekt- / Funktionsnamen beginnend mit Großbuchstaben und den Instanznamen beginnend mit einem Kleinbuchstaben anzuzeigen.
– Naresh
12. Dezember 2013 um 4:25 Uhr
Das habe ich mir gedacht, deshalb habe ich meine Antwort so geschrieben, wie ich es getan habe. Ich wollte nur sagen, dass ich wirklich froh bin, dass andere Module auf die gleiche Weise betrachten. Ich verwende oft das Schlüsselwort new und organisiere meine Module so, dass sie eine einzelne Konstruktorfunktion exportieren. Ich finde, es erleichtert die Lesbarkeit und Konzeptualisierung von Lösungen. Ich kann auf einen Blick erkennen, welche Art von Konstrukt ich verwenden möchte. Kudos, dass du wie ich denkst 😉
– Sukima
12. Dezember 2013 um 14:57 Uhr
Sukima
CommonJS-Module ermöglichen zwei Möglichkeiten, exportierte Eigenschaften zu definieren. In beiden Fällen geben Sie ein Objekt/eine Funktion zurück. Da Funktionen in JavaScript erstklassige Bürger sind, können sie sich wie Objekte verhalten (technisch gesehen sind sie Objekte). Das sagte Ihre Frage zur Verwendung der new keywords hat eine einfache Antwort: Ja. Ich werde es veranschaulichen …
Modulexporte
Sie können entweder die verwenden exports Variable, die bereitgestellt wird, um ihr Eigenschaften hinzuzufügen. Sobald sie in einem anderen Modul benötigt werden, werden diese zugewiesenen Eigenschaften verfügbar. Oder Sie können der Eigenschaft module.exports ein Objekt zuweisen. In jedem Fall, was von zurückgegeben wird require() ist ein Verweis auf den Wert von module.exports.
Ein Pseudo-Code-Beispiel, wie ein Modul definiert ist:
var theModule = {
exports: {}
};
(function(module, exports, require) {
// Your module code goes here
})(theModule, theModule.exports, theRequireFunction);
Im obigen Beispiel module.exports und exports sind dasselbe Objekt. Der coole Teil ist, dass Sie nichts davon in Ihren CommonJS-Modulen sehen, da das gesamte System dafür sorgt, dass Sie nur wissen müssen, dass es ein Modulobjekt mit einer exports-Eigenschaft und einer exports-Variablen gibt, die auf die zeigt dasselbe tut das module.exports.
Bei Konstruktoren erforderlich
Da kann man direkt eine Funktion anhängen module.exports Sie können im Wesentlichen eine Funktion zurückgeben, und wie jede Funktion könnte sie als verwaltet werden Konstrukteur (Das ist kursiv, da der einzige Unterschied zwischen einer Funktion und einem Konstruktor in JavaScript darin besteht, wie Sie sie verwenden möchten. Technisch gesehen gibt es keinen Unterschied.)
Das Folgende ist also ein perfekt guter Code, und ich persönlich ermutige ihn:
// My module
function MyObject(bar) {
this.bar = bar;
}
MyObject.prototype.foo = function foo() {
console.log(this.bar);
};
module.exports = MyObject;
// In another module:
var MyObjectOrSomeCleverName = require("./my_object.js");
var my_obj_instance = new MyObjectOrSomeCleverName("foobar");
my_obj_instance.foo(); // => "foobar"
Require für Nicht-Konstrukteure
Dasselbe gilt für Nicht-Konstruktor-ähnliche Funktionen:
// My Module
exports.someFunction = function someFunction(msg) {
console.log(msg);
}
// In another module
var MyModule = require("./my_module.js");
MyModule.someFunction("foobar"); // => "foobar"
Kann ich auch kurz require(‘./my-object.js’)(“foobar”) machen? Oder ist die Syntax require(‘module’)(params) für einen anderen Anwendungsfall?
– Hampus Ahlgren
17. Dezember 2014 um 14:26 Uhr
Nichts hält Sie auf, es ist alles nur JavaScript. Also ja, Sie können die kürzere Syntax verwenden.
– Sukima
17. Dezember 2014 um 21:51 Uhr
Das Pseudo-Code-Beispiel, wie ein Modul definiert ist, hat mein Verständnis des Node.js-Modulsystems vollständig geklärt. Vielen Dank!
– Nitax
11. Februar 2016 um 3:24 Uhr
maček
Meiner Meinung nach sind einige der node.js-Beispiele ziemlich konstruiert.
Sie könnten erwarten, so etwas in der realen Welt öfter zu sehen
// square.js
function Square(width) {
if (!(this instanceof Square)) {
return new Square(width);
}
this.width = width;
};
Square.prototype.area = function area() {
return Math.pow(this.width, 2);
};
module.exports = Square;
Verwendungszweck
var Square = require("./square");
// you can use `new` keyword
var s = new Square(5);
s.area(); // 25
// or you can skip it!
var s2 = Square(10);
s2.area(); // 100
Wenn Sie eine Klasse verwenden, müssen Sie muss benutze die new Schlüsselwort, um es einzufügen. Alles andere bleibt gleich.
Ungewöhnlich prägnanter Aufbau!
– Christoph Marois
8. Juli 2014 um 15:58 Uhr
Es scheint also, als gäbe es in Ihrem new und nicht verwenden. Aber ist das nur, weil Sie diesen Scheck haben? this instanceof square? Wenn ja, was macht dieser Mechanismus genau?
– Arichards
13. September 2016 um 17:45 Uhr
Fragen, die ich hatte und nachgeschlagen habe, falls es für andere hilfreich ist: Wo sind import und export definiert? Dies sind reservierte Schlüsselwörter in ECMAScript 6 (ES6). Vor ES6 musste man Bibliotheken verwenden, um Module zu verwalten. Die Modulierung des Knotens ist den Modulen der CommonJS-Bibliothek nachempfunden. Was ist der default in export default Square? Dies gibt an, was importiert werden soll, wenn Sie nur die „Datei“ importieren und keine anderen, spezifischen Exporte aus dieser Datei. Solange es sie gibt, fand ich diese Seiten hilfreich: spring.io/understanding/javascript-modules und explorejs.com/es6/ch_modules.html
– Arichards
13. September 2016 um 18:42 Uhr
Brad
Diese Frage hat eigentlich nichts mit dem Wie zu tun require() funktioniert. Im Grunde alles, was Sie einstellen module.exports to in Ihrem Modul wird von zurückgegeben require() rufe danach.
Es besteht keine Notwendigkeit für die new Schlüsselwort beim Anruf square. Sie geben nicht die Funktionsinstanz selbst zurück square, geben Sie am Ende ein neues Objekt zurück. Daher können Sie diese Funktion einfach direkt aufrufen.
Für kompliziertere Argumente herum newsehen Sie sich Folgendes an: Wird das “new”-Schlüsselwort von JavaScript als schädlich angesehen?
Es ist nichts falsch daran, das Schlüsselwort new zu verwenden. Ich hasse den ganzen FUD drumherum.
– Sukima
12. Dezember 2013 um 3:58 Uhr
@Sukima Einverstanden. 😀 Ich weise darauf hin, warum es in diesem Fall keine Rolle spielt, und verknüpfe die andere Frage bzgl new damit andere dort am Krieg teilnehmen können.
exports.square = function(width,callback)
{
var aa = new Object();
callback(aa.squareVal = width * width);
}
Am Ende geht es bei Node um Javascript. JS hat mehrere Möglichkeiten, etwas zu erreichen, es ist dasselbe, einen “Konstruktor” zu bekommen, Wichtig ist, eine Funktion zurückzugeben.
Auf diese Weise erstellen Sie tatsächlich eine neue Funktion, wie wir sie beispielsweise mit JS in einer Webbrowser-Umgebung erstellt haben.
Persönlich bevorzuge ich den Prototyp-Ansatz, wie Sukima in diesem Beitrag vorgeschlagen hat: Node.js – use of module.exports as a constructor
12453600cookie-checkNode.js – Verwendung von module.exports als Konstruktoryes
Ihr Beispiel ist ein Syntaxfehler. Nach Umbenennung
square
zuSquare
dasnew square()
existiert nicht mehr.– Sukima
12. Dezember 2013 um 3:57 Uhr
Entschuldigung, das war ein Tippfehler. Behoben. Meine Absicht war es, den Objekt- / Funktionsnamen beginnend mit Großbuchstaben und den Instanznamen beginnend mit einem Kleinbuchstaben anzuzeigen.
– Naresh
12. Dezember 2013 um 4:25 Uhr
Das habe ich mir gedacht, deshalb habe ich meine Antwort so geschrieben, wie ich es getan habe. Ich wollte nur sagen, dass ich wirklich froh bin, dass andere Module auf die gleiche Weise betrachten. Ich verwende oft das Schlüsselwort new und organisiere meine Module so, dass sie eine einzelne Konstruktorfunktion exportieren. Ich finde, es erleichtert die Lesbarkeit und Konzeptualisierung von Lösungen. Ich kann auf einen Blick erkennen, welche Art von Konstrukt ich verwenden möchte. Kudos, dass du wie ich denkst 😉
– Sukima
12. Dezember 2013 um 14:57 Uhr