在控制器中为Express + NodeJS应用程序使用ES6类或对象文字

时间:2016-06-18 09:56:42

标签: javascript node.js express ecmascript-6

有两件事我很困惑。

  1. 使用任何ES6类或对象文字的优点是什么。

  2. 我应该在哪里使用它们?

  3. 我尝试过的一些例子如下所述。请让我知道何时使用特定的实施方式以及何时不使用。

    类示例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();
    

    Object Literal示例:

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

    我从阅读中得到的结论是:

    类示例1:

    • 您无法创建多个对象。因为模块只执行一次。因此,在每次导入时,您将获得相同的对象。类似于单身人士的东西。 (如果我误解了,请在此纠正我)

    • 您将无法访问该类的静态方法,因为您只导出该类的对象。

    类示例2:

    • 如果你有一个只包含辅助方法的类,并且该对象没有任何状态,那么始终创建该类的对象是没有意义的。因此,如果是辅助类,则不应使用它。

    对象文字示例:

    • 你不能继承。

    • 每个需求都会传递相同的对象。 (如果我在这里错了,请纠正我)

    请帮助我理解这些概念,我错过的内容,我误解的内容以及应该在何时何地使用的内容。我非常感谢你的帮助。

    如果您认为我在某个地方犯了错误,请随时编辑问题。

2 个答案:

答案 0 :(得分:6)

  

类示例1:您不能创建多个对象。因为模块只执行一次。因此,在每次导入时,您将获得相同的对象。类似于单身人士的东西。

正确。因此,这是一个反模式。不要使用它。 class语法不能替代对象文字。

  

您将无法访问该类的静态方法,因为您只导出该类的对象。

从理论上讲,你可以做auth.constructor.…,但这并不好。

  

类示例2:如果您的类只包含辅助方法,并且该对象没有任何状态,那么始终创建此类的对象是没有意义的。因此,如果是辅助类,则不应使用它。

正确。改为使用简单的对象文字,甚至更好:使用多个命名导出而不是“实用程序对象”。

  

Object Literal示例:您不能继承。

您仍然可以使用Object.create进行继承,或寄生继承,或者任何事情。

  

每个要求都会传递相同的对象。

正确,但这不是一个缺点。如果您的对象包含状态,则应该使用class代替。

答案 1 :(得分:0)

如果你的类有一个构造函数,你可以从这个类中构建几个对象:

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;
    }
}