【问题标题】:Using ES6 classes OR Object Literals in controllers for an Express + NodeJS app在 Express + NodeJS 应用程序的控制器中使用 ES6 类或对象文字
【发布时间】:2016-06-18 09:56:41
【问题描述】:

有两件事我很困惑。

  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:

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

对象字面量示例:

  • 不能继承。

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

请帮助我理解这些概念、我遗漏了什么、我误解了什么以及应该在何时何地使用什么。非常感谢您的帮助。

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

【问题讨论】:

    标签: javascript node.js express ecmascript-6


    【解决方案1】:

    类示例 1:您不能创建超过 1 个对象。因为一个模块只执行一次。因此,在每次导入时,您都会得到相同的对象。类似于单例的东西。

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

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

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

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

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

    对象字面量示例:不能进行继承。

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

    每次请求都会传递相同的对象。

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

    【讨论】:

    • 好的,太好了!我在想类是对象文字的替代品。那不是真的吗?在整个项目中混合使用类和对象字面量是否可以(使用对象字面量的控制器和一些使用类保存状态的服务)?谢谢。
    • 我会接受你的回答,因为它澄清了我几乎所有的疑问。谢谢:)
    • 不,class 语法是构造函数声明 + 原型的替代品。你应该只在它们携带状态/你需要多个实例时使用它们。您可以而且应该将它们与对象混合,使用任何合适的东西。请注意,对象字面量语法在 ES6 中也通过简洁的方法和计算属性得到了增强。
    • @Bergi '多个命名导出而不是“实用程序对象”',使用它有什么好处?如果我有一个单独的utils.js 来存储我需要的 20 个小功能,那么将整个 utils.js 导入到我需要其中一些功能的任何文件中是不是更容易且更易于维护?所以我总是可以移动/重构东西,我的utils.anyMethod(); 总是会被定义?
    • @Mirko 优点是声明更简单,导入更灵活,捆绑时可以摇树,本地模块支持更好,等等。是的,您仍然可以使用import * as utils from "utils.j" 并完全按照utils.anyMethod() 使用它们。没有理由默认导出对象。
    【解决方案2】:

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

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

    【讨论】:

    • 是的,你显然可以这样做。我想知道的是何时何地使用这 3 个场景,以及其中一个场景的优缺点是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    相关资源
    最近更新 更多