Использование классов ES6 ИЛИ Object Literal в контроллерах для приложения Express + NodeJS

Есть две вещи, которые меня очень смущают.

В чем преимущество использования любого из литералов класса ES6 или Object.

И где я должен использовать любой из них?

Некоторые из примеров, которые я пробую, упомянуты ниже. Пожалуйста, дайте мне знать, когда использовать конкретный способ реализации, а когда нет.

Пример класса 1:

// auth.js
class Auth {
  login(req, res) {...}
  signup(req, res) {...}
}

module.exports = new Auth();

// index.js
const auth = require('auth');

Пример класса 2:

// auth.js
class Auth {
  login(req, res) {...}
  signup(req, res) {...}
}

module.exports = Auth;

// index.js
const Auth = require('auth');
const auth = new Auth();

Пример литерала объекта:

// auth.js
module.exports = {
  login: (req, res) => {...},
  signup: (req, res) => {...}
};

// index.js
const auth = require('auth');

Что я думаю, прочитав о них, так это:

Пример класса 1:

Вы не можете создать более 1 объекта. Потому что модуль выполняется только один раз. Таким образом, при каждом импорте вы получите один и тот же объект. Нечто похожее на синглтон. (Поправьте меня здесь, если я неправильно понял)

Вы не сможете получить доступ к статическим методам класса, потому что вы экспортируете только объект класса.

Пример класса 2:

Если у вас есть класс, который не содержит ничего, кроме вспомогательных методов, а объект не имеет какого-либо состояния, бессмысленно все время создавать объект этого класса. Таким образом, в случае вспомогательных классов это не должно использоваться.

Пример литерала объекта:

Вы не можете сделать наследство.

Один и тот же объект будет передаваться по каждому требованию. (Поправьте меня, если я здесь тоже не прав)

Пожалуйста, помогите мне понять эти понятия, что я упускаю, что я неправильно понял и что следует использовать, когда и где. Я буду очень благодарен за вашу помощь.

Не стесняйтесь редактировать вопрос, если вы думаете, что я где-то допустил ошибку.

Ответы на вопрос(2)

Решение Вопроса

Пример класса 1: Вы не можете создать более 1 объекта. Потому что модуль выполняется только один раз. Таким образом, при каждом импорте вы получите один и тот же объект. Нечто похожее на синглтон.

Правильный. Поэтому это антипаттерн. Не используйте это.class синтаксис не заменяет объектные литералы.

Вы не сможете получить доступ к статическим методам класса, потому что вы экспортируете только объект класса.

Теоретически вы можете сделатьauth.constructor.… но это не хорошо

Пример класса 2: Если у вас есть класс, который не содержит ничего, кроме вспомогательных методов, и у объекта нет состояния, нет смысла все время создавать объект этого класса. Таким образом, в случае вспомогательных классов это не должно использоваться.

Правильный. Вместо этого используйте простой литерал объекта или, что еще лучше, несколько именованных экспортов вместо «служебных объектов».

Object Literal Пример: вы не можете делать наследование.

Вы все еще можете использоватьObject.create делать наследство, или паразитическое наследование, или действительно что-нибудь.

Один и тот же объект будет передаваться по каждому требованию.

Правильно, но это не недостаток. Если ваш объект содержит состояние, вы должны были использоватьclass вместо.

 Dangling Cruze18 июн. 2016 г., 14:38
Большой! Спасибо за очистку этого.
 Dangling Cruze18 июн. 2016 г., 13:15
Я приму ваш ответ, поскольку он прояснит почти все мои сомнения. Спасибо :)
 Mirko02 нояб. 2016 г., 15:25
@ Берги спасибо, хорошие вещи
 Bergi02 нояб. 2016 г., 12:38
@Mirko Преимуществами являются более простые декларации, большая гибкость при импорте, возможность встряхивания дерева при связывании, лучшая работа с поддержкой встроенных модулей и многое другое. И да, вы все еще можете сделатьimport * as utils from "utils.j" и использовать их точно так же, какutils.anyMethod(), Нет причин для экспорта объекта по умолчанию.
 Bergi18 июн. 2016 г., 14:25
Нет,class синтаксис заменяет объявления конструктора + прототипы. Вы должны использовать их только тогда, когда они несут состояние / вам нужно несколько экземпляров. Вы можете и должны смешивать их с объектами, использовать все, что подходит. Обратите внимание, что синтаксис литерала объекта был улучшен с помощью кратких методов и вычисляемых свойств также в ES6.
 Mirko02 нояб. 2016 г., 12:31
@Bergi «несколько именованных экспортов вместо« служебных объектов »», в чем преимущество этого? если у меня есть одинutils.js где я храню, скажем, 20 небольших функций, которые мне нужны, не проще ли и удобнее ли просто импортировать весь файл utils.js в любой файл, где мне нужны некоторые из этих функций? Так что я всегда могу перемещать вещи / рефакторинг и мойutils.anyMethod(); всегда будет определяться?
 Dangling Cruze18 июн. 2016 г., 13:09
Хорошо, отлично! Я думал, что классы являются своего рода заменой объектных литералов. Разве это не правда тогда? И нормально ли иметь в своем проекте сочетание классов и литералов объектов (контроллеры используют литералы объектов и некоторые службы, которые поддерживают состояние, используя классы)? Благодарю.

Если у вашего класса есть конструктор, вы можете построить несколько объектов из этого класса threw:

var Panier= require('./panier');    
var panier1 = new Panier(13, 12, 25);
var panier2 = new Panier(1, 32, 569);

Конечно, ваш Panier будет определен в файле Panier.js, расположенном в том же каталоге:

module.exports = class Panier
{
    constructor(code, qte, prix)
    {
        this.codeArticle = code;
        this.qteArticle = qte;
        this.prixArticle = prix;
    }
    getCode()
    {
        return this.codeArticle;
    }
    getQte()
    {
        return this.qteArticle;
    }
    getPrix()
    {
        return this.prixArticle;
    }
}
 Dangling Cruze18 июн. 2016 г., 12:30
Да, вы, очевидно, можете сделать это. То, что я хочу знать, - это когда и где использовать 3 сценария и каковы преимущества / недостатки одного перед другим.

Ваш ответ на вопрос