Bis jetzt habe ich Klassen und Module node.js
folgendermaßen erstellt:
var fs = require('fs');
var animalModule = (function () {
/**
* Constructor initialize object
* @constructor
*/
var Animal = function (name) {
this.name = name;
};
Animal.prototype.print = function () {
console.log('Name is :'+ this.name);
};
return {
Animal: Animal
}
}());
module.exports = animalModule;
Mit ES6 können Sie jetzt einfach "aktuelle" Klassen erstellen:
class Animal{
constructor(name){
this.name = name ;
}
print(){
console.log('Name is :'+ this.name);
}
}
Nun, zuallererst liebe ich das :) aber es wirft eine Frage auf. Wie nutzen Sie dies in Kombination mit node.js
der Modulstruktur?
Angenommen, Sie haben eine Klasse, in der Sie ein Modul zur Demonstration verwenden möchten. Sagen Sie, Sie möchten es verwenden fs
So erstellen Sie Ihre Datei:
Animal.js
var fs = require('fs');
class Animal{
constructor(name){
this.name = name ;
}
print(){
console.log('Name is :'+ this.name);
}
}
Wäre das der richtige Weg?
Wie können Sie diese Klasse anderen Dateien in meinem Knotenprojekt aussetzen? Und könnten Sie diese Klasse trotzdem erweitern, wenn Sie sie in einer separaten Datei verwenden?
Ich hoffe einige von euch können diese Fragen beantworten :)
javascript
node.js
ecmascript-6
Marc Rasmussen
quelle
quelle
animalModule
ist in einem Knotenmodul, das ohnehin einen eigenen Modulbereich hat, ziemlich sinnlos.Antworten:
Ja, Ihr Beispiel würde gut funktionieren.
Wenn Sie Ihre Klassen verfügbar machen möchten, können Sie
export
eine Klasse wie alles andere erstellen:Oder je kürzer:
Nach dem Import in ein anderes Modul können Sie es so behandeln, als ob es in dieser Datei definiert wäre:
quelle
module.exports
wird normalerweise für einen anonymen Export verwendet, währendexport
er für einen benannten Export verwendet wird. Dies ist eine grundlegende Codierungshöflichkeit (könnte man sagen), die anderen helfen kann, zu wissen, wie Sie Ihre Klasse, Ihr Modul usw. importieren.module.exports = Animal;
wäre die Antwort oder das direkteste Äquivalent zur Frage und ist zusammen mit demconst Animal = require('./animal');
aufrufenden Code gültig . Können Sie Ihre Antwort aktualisieren, um sie aufzunehmen?Behandeln Sie den ES6-Klassennamen genauso, wie Sie den Konstruktornamen auf ES5-Weise behandelt hätten. Sie sind ein und dasselbe.
Die ES6-Syntax ist nur syntaktischer Zucker und erstellt genau denselben zugrunde liegenden Prototyp, dieselbe Konstruktorfunktion und dieselben Objekte.
In Ihrem ES6-Beispiel mit:
Sie können einfach
Animal
wie den Konstruktor Ihres Objekts behandeln (genau wie in ES5). Sie können den Konstruktor exportieren. Sie können den Konstruktor mit aufrufennew Animal()
. Für die Verwendung ist alles gleich. Nur die Deklarationssyntax ist unterschiedlich. Es gibt sogar noch eineAnimal.prototype
, die alle Ihre Methoden enthält. Der ES6-Weg erzeugt wirklich das gleiche Codierungsergebnis, nur mit einer schickeren / schöneren Syntax.Auf der Importseite würde dies dann folgendermaßen verwendet:
Dieses Schema exportiert den Animal-Konstruktor als
.Animal
Eigenschaft, mit der Sie mehr als eine Sache aus diesem Modul exportieren können.Wenn Sie nicht mehr als eine Sache exportieren müssen, können Sie dies tun:
Und dann importieren Sie es mit:
quelle
module.exports = Animal
ist die einzige Lösung, die funktioniert.require()
als das, was Ihr Export zeigt. Deshalb würde einer funktionieren und der andere nicht. Sie müssen die Funktionsweise des Imports mit der Definition des Exports abgleichen. Weitere Details, um dies zu erklären, fügten meiner Antwort hinzu.Die ES6-Art der Anforderung ist
import
. Sie könnenexport
Ihre Klasse mithilfe derimport { ClassName } from 'path/to/ClassName'
Syntax an eine andere Stelle importieren .quelle
The ES6 way
ist etwas irreführend.import
overrequire
nur aus Gründen der Syntaxkonsistenz verwenden.import
mit CommonJS-Modulen zusammenarbeitet, wahrscheinlich nicht in Node funktioniert. Daher könnten in Zukunft Codeänderungen erforderlich sein, um mit Node ohne Babel kompatibel zu sein .Verwenden von Klassen im Knoten -
Hier benötigen wir das ReadWrite-Modul und rufen ein makeObject () auf, das das Objekt der ReadWrite-Klasse zurückgibt. Womit wir die Methoden aufrufen. index.js
ReadWrite.js
Hier erstellen wir eine makeObject-Methode, die sicherstellt, dass ein Objekt nur zurückgegeben wird, wenn ein Objekt nicht verfügbar ist.
Weitere Erklärungen finden Sie unter https://medium.com/@nynptel/node-js-boiler-plate-code-using-singleton-classes-5b479e513f74
quelle
In der Klassendatei können Sie entweder Folgendes verwenden:
oder Sie können diese Syntax verwenden
Um diese Klasse in einer anderen Datei zu verwenden, müssen Sie diese Schritte ausführen. Benötigen Sie zuerst diese Datei mit dieser Syntax:
const anyVariableNameHere = require('filePathHere');
Dann erstellen Sie ein Objekt
const classObject = new anyVariableNameHere();
Danach können Sie
classObject
auf die eigentlichen Klassenvariablen zugreifenquelle