Node.js – Verwendung von module.exports als Konstruktor

Lesezeit: 4 Minuten

Benutzer-Avatar
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 .

Das angegebene Beispiel ist:

// file: square.js
module.exports = function(width) {
  return {
    area: function() {
      return width * width;
    }
  };
}

und so verwendet:

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

Benutzer-Avatar
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

Benutzer-Avatar
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

Für die ES6-Leute

class Square {
  constructor(width) {
    this.width = width;
  }
  area() {
    return Math.pow(this.width, 2);
  }
}

export default Square;

Verwenden Sie es in ES6

import Square from "./square";
// ...

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

Benutzer-Avatar
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.

Dies wäre äquivalent zu:

var square = function(width) {
  return {
    area: function() {
      return width * width;
    }
  };
}

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.

    – Brad

    12. Dezember 2013 um 3:59 Uhr

Der Beispielcode lautet:

in der Hauptsache

square(width,function (data)
{
   console.log(data.squareVal);
});

die Verwendung der folgenden kann funktionieren

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

1245360cookie-checkNode.js – Verwendung von module.exports als Konstruktor

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy