2016-06-18 9 views
8

非常に混乱している2つのことがあります。Express + NodeJSアプリケーション用のコントローラのES6クラスまたはオブジェクトリテラルの使用

  1. ES6クラスまたはオブジェクトリテラルを使用する利点は何ですか?

  2. そして、どこで使用すればよいですか?

私が試しているいくつかの例を以下に挙げます。具体的な実施方法をいつ使用するのか、そうでないのかを教えてください。

クラスの例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:あなたはヘルパーメソッドしか含まれていないクラスを持っていると、オブジェクトがどのような状態を持っていない場合は

  • は、それは、このクラスのオブジェクトを作成する意味がありませんすべて時間。したがって、ヘルパークラスの場合、これは使用すべきではありません。

オブジェクトリテラルの例:

  • あなたは継承を行うことはできません。

  • 同じオブジェクトは、必要なときに渡されます。

は私がこれらの概念を理解する助けてください(私はここにも間違っているなら、私を修正して)、私は欠けているものを、私が誤解してきたし、何がいつ、どこで使用すべきです。私はあなたの助けに非常に感謝しています。

あなたがどこかで間違いを犯したと思われる場合は、自由に質問を編集してください。あなたのクラスがコンストラクタを持っている場合は、このクラスから複数のオブジェクトを構築することができ

答えて

5

クラス例1:複数のオブジェクトを作成することはできません。モジュールは一度だけ実行されるためです。したがって、すべてのインポート時に同じオブジェクトが取得されます。シングルトンに似たもの。

正しいです。したがってこれは反パターンである。それを使用しないでください。 class構文は、オブジェクトリテラルの代わりにはなりません。

クラスのオブジェクトをエクスポートするだけなので、クラスの静的メソッドにアクセスすることはできません。

理論的にはauth.constructor.…できますが、それはいいです。

クラス例2:ヘルパーメソッド以外の何も含まれておらず、オブジェクトに状態がない場合、このクラスのオブジェクトを常に作成するのは意味がありません。したがって、ヘルパークラスの場合、これは使用すべきではありません。

正しいです。代わりに、単純なオブジェクトリテラルを使用するか、「ユーティリティオブジェクト」ではなく複数の名前付きエクスポートを使用します。

例リテラルの例:継承はできません。

でも継承または寄生継承を行うことができます。

同じオブジェクトは、必要なときに渡されます。

正解ですが、それは不利ではありません。オブジェクトに状態が含まれている場合は、代わりにclassを使用してください。

+0

大丈夫です!私は、クラスがオブジェクトリテラルの代わりになると考えていました。それは本当ですか?そして、プロジェクト全体(オブジェクトリテラルを使用するコントローラと、クラスを使用して状態を保持する一部のサービス)で、クラスとオブジェクトリテラルの両方を混在させることはできますか?ありがとう。 –

+0

私の疑問のほとんどすべてを明らかにするので、私はあなたの答えを受け入れるでしょう。ありがとう:) –

+3

いいえ、 'class'構文はコンストラクタ宣言+プロトタイプの代わりです。状態を保持するときにのみ使用する必要があります。複数のインスタンスが必要です。あなたはそれらをオブジェクトと混在させることができますし、混在させることもできます。オブジェクトのリテラル構文は、ES6でも簡潔なメソッドと計算されたプロパティで強化されています。 – Bergi

0

が投げた:もちろん

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

をあなたのパニエは同じディレクトリにあるファイル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; 
    } 
} 
+0

はい、明らかにそうすることができます。私が知りたいのは、3つのシナリオをいつ、どこで使うのか、また、他のシナリオの利点/欠点は何か。 –

関連する問題