Итак, до сих пор я создавал классы и модули node.js
следующим образом:
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;
Теперь с ES6 вы можете создавать «настоящие» классы следующим образом:
class Animal{
constructor(name){
this.name = name ;
}
print(){
console.log('Name is :'+ this.name);
}
}
Сейчас, во-первых, мне это нравится :) но возникает вопрос. Как вы используете это в сочетании со node.js
структурой модулей?
Скажем, у вас есть класс, в котором вы хотите использовать модуль для демонстрации, скажем, вы хотите использовать fs
поэтому вы создаете свой файл:
Animal.js
var fs = require('fs');
class Animal{
constructor(name){
this.name = name ;
}
print(){
console.log('Name is :'+ this.name);
}
}
Будет ли это правильный путь?
Кроме того, как предоставить этот класс другим файлам в моем проекте узла? И сможете ли вы расширить этот класс, если будете использовать его в отдельном файле?
Надеюсь, некоторые из вас ответят на эти вопросы :)
javascript
node.js
ecmascript-6
Марк Расмуссен
источник
источник
animalModule
, довольно бессмысленен в модуле узла, который в любом случае имеет свою собственную область видимости.Ответы:
Да, ваш пример подойдет.
Что касается раскрытия ваших классов, вы можете
export
использовать класс, как и все остальное:Или короче:
После импорта в другой модуль вы можете рассматривать его так, как если бы он был определен в этом файле:
источник
module.exports
обычно используется для анонимного экспорта, тогдаexport
как используется для именованного экспорта. Это базовая любезность кодирования (можно сказать), которая может помочь другим узнать, как импортировать ваш класс, модуль и т. Д.module.exports = Animal;
будет ответом или наиболее прямым эквивалентом вопроса и действителен вместе сconst Animal = require('./animal');
вызывающим кодом. Можете ли вы обновить свой ответ, включив его?Просто обращайтесь с именем класса ES6 так же, как с именем конструктора в ES5. Они одно и то же.
Синтаксис ES6 - это просто синтаксический сахар и создает точно такой же базовый прототип, функцию конструктора и объекты.
Итак, в вашем примере ES6 с:
Вы можете рассматривать его
Animal
как конструктор вашего объекта (так же, как вы поступили бы в ES5). Вы можете экспортировать конструктор. Вы можете вызвать конструктор с помощьюnew Animal()
. Все то же самое и с его использованием. Отличается только синтаксис объявления. ДажеAnimal.prototype
есть все ваши методы. Способ ES6 действительно дает тот же результат кодирования, только с более красивым / красивым синтаксисом.На стороне импорта это будет использоваться следующим образом:
Эта схема экспортирует конструктор Animal как
.Animal
свойство, которое позволяет вам экспортировать более одного объекта из этого модуля.Если вам не нужно экспортировать более одного объекта, вы можете сделать это:
А затем импортируйте его с помощью:
источник
module.exports = Animal
это единственное решение, которое работает.require()
от того, что показывает ваш экспорт, поэтому одно будет работать, а другое - нет. Вы должны согласовать то, как работает импорт, с тем, как определяется экспорт. К моему ответу добавлены более подробные объяснения.Способ запроса ES6 -
import
. Вы можетеexport
импортировать свой класс в другое место, используяimport { ClassName } from 'path/to/ClassName'
синтаксис.источник
The ES6 way
несколько неверно.import
overrequire
только ради согласованности синтаксиса.import
взаимодействия Babel с модулями CommonJS маловероятно, что в конечном итоге будет работать в Node, поэтому в будущем может потребоваться изменение кода для совместимости с Node без Babel .Использование классов в узле -
Здесь нам нужен модуль ReadWrite и вызывается makeObject (), который возвращает объект класса ReadWrite. Которые мы используем для вызова методов. index.js
ReadWrite.js
Здесь мы создаем метод makeObject, который гарантирует, что объект будет возвращен, только если объект недоступен.
Для получения дополнительных объяснений перейдите на https://medium.com/@nynptel/node-js-boiler-plate-code-using-singleton-classes-5b479e513f74.
источник
В файле класса вы можете использовать:
или вы можете использовать этот синтаксис
С другой стороны, чтобы использовать этот класс в любом другом файле, вам необходимо выполнить следующие действия. Сначала потребуйте этот файл, используя этот синтаксис:
const anyVariableNameHere = require('filePathHere');
Затем создайте объект
const classObject = new anyVariableNameHere();
После этого вы можете использовать
classObject
для доступа к фактическим переменным классаисточник