web-dev-qa-db-fra.com

Différences entre la création d'une nouvelle classe et l'utilisation de const d'exportation

Installer:

  • BabelJS (es2015, react, stage-1)
  • Webpack
  • Réagir/redux

Nouveau sur CommonJS et ES6. Je connais la différence entre une instance d'objet et un conteneur statique de méthodes, mais je ne sais pas comment elles se comportent lorsqu'elles sont séparées des modules. Je me demande donc quelles sont les différences entre le retour d'une instance (ce modèle est-il valable du tout?):

// StateParser.js

class StateParser {
    constructor() {
     }

     method1() {
        ...
     }

}

export default new StateParser()

et exporter des méthodes const:

// StateParser.js

let state = {
}

export const method1 = () => { ... }
  1. Méthode A: y aurait-il une nouvelle instance à chaque importation?
  2. Méthode B: est l'un des avantages de la possibilité d'utiliser la déstructuration d'objets:

    import { method1 } from '../utils/StateParser.js';
    

    puis utiliser method1 comme si elle existait localement?

  3. Méthode A: l'un des avantages est-il la capacité d'initialiser l'état dans le constructeur?

Donc, fondamentalement, je ne sais pas quand l'utiliser pour mes classes utilitaires et j'apprécierais votre contribution.

13
Guy

Y aurait-il une nouvelle instance à chaque fois que j'importe A?

Non, les modules ne sont évalués qu'une seule fois.

L'un des avantages de B est-il la capacité d'utiliser la déstructuration d'objets et d'utiliser la méthode 1 comme si elle existait localement?

Oui, mais ce n'est pas appelé "déstructuration". Ce sont des importations nommées (ou des exportations nommées du module), et ils ne s'emboîtent pas et utilisent une syntaxe différente pour l'aliasing.

L'un des avantages de A est-il la capacité d'initialiser l'état dans le constructeur?

Non. Vous pouvez également initialiser l'état du module directement dans la portée du module, vous n'avez pas besoin d'une fonction constructeur pour cela.

Mais oui, si vous avez un état dans les instances, c'est une bonne idée d'utiliser une classe que vous pouvez instancier plusieurs fois . Pour cela, vous devez exporter la classe elle-même, pas une instance, bien sûr.

Est le export default new … modèle valide du tout?

Non, c'est un contre-modèle pour les raisons décrites ci-dessus. Étant donné que la classe n'est utilisée nulle part ailleurs, elle est assez similaire à l'anti-modèle classe anonyme . Et exporter plusieurs exportations nommées c'est beaucoup mieux que les objets d'exportation par défaut de toute façon.

19
Bergi

Nous ne recommandons pas exporter une évaluation (par exemple new StateParser()) pour plusieurs raisons.

Dans ce cas, le module exporte le résultat qui n'est évalué qu'une seule fois (également mentionné par @Bergi). C'est rarement le résultat souhaité, mais s'il l'est, un modèle Singleton devrait être utilisé à la place. Certains avantages du module ES6 sont perdus ( arborescence et accès plus rapide aux importations ), cela ralentit les importations et permet de provoquer des effets secondaires qui devraient plutôt se produire lors de l'invocation . Je pense également que c'est un anti-modèle et les inconvénients peuvent être évités en exportant une fonction ou une classe.

Il serait plus logique de comparer export default StateParser avec l'exportation des méthodes const.

Voir également:

0
thisismydesign