nodejs中的类与模块

时间:2017-09-29 17:10:24

标签: node.js

我的问题是如果在nodejs或函数或原型和模块中使用类更好,我知道大多数使用模块和函数原型,但哪个更好?

我们大多数人认为,所有编程语言中的类都是最好的工作选择。

提前谢谢

3 个答案:

答案 0 :(得分:1)

  

我的问题是如果在nodejs或函数或原型和模块中使用类更好,我知道大多数使用模块和函数原型,但哪个更好?

您的问题似乎有点误导。在node.js中,不会在类,原型和模块之间进行选择。

Javascript中的第一个关闭类使用原型。 class语法只是用于在原型上定义构造函数和方法的语法糖。当您使用class语法时,您将创建一个带有原型的构造函数,并将方法添加到原型中(在封面下)。因此,在使用类和使用原型之间没有权衡。

唯一的权衡是使用新的class语法来定义原型与使用旧的手动方式。

然后,类几乎与模块正交。当您想要在模块接口中封装代码体时,可以使用模块,这样您就可以获得使用模块的所有好处(更容易共享,重用,记录,测试等......)。该模块界面可以是您认为最适合您环境的任何内容。您可以导出一系列普通函数。您可以导出一个或多个对象构造函数。您可以导出为您创建对象的工厂函数,然后可以使用方法。模块方案非常灵活,因此您可以导出几乎任何类型的接口(如果您愿意,类可以是其中的一部分)。

没有“最佳”方式从模块中导出东西,因为它取决于您的需求,您选择的架构和编码风格等......

答案 1 :(得分:1)

类与模块是错误的问题

您要查找的问题是 类与原型

使用了 原型 >模块

模块(ES2015模块)是JavaScript用来exportimport进行编码的模块。在JavaScript正式实现模块之前,有黑客可以这样做并创建代码封装,从而解决了诸如污染全球范围等问题。 Immediately Invoked Function Expressions是一个示例。带有CommonJS的Node.js和带有AMD的Angular以及其他一些公司试图找出如何以更好的方式做到这一点,并实现了自己的“模块”系统。我想认为ES2015模块受其他语言和CommonJS / Amd等的影响,因此,我们现在有了使用JavaScript的模块系统。

对于类,它们自己创建代码封装,但是不能导出自身,这就是模块的作用。基于原型的代码也是如此,它创建代码封装,但不能像类一样自我导出。

现在将其放在一起。

一个模块示例,该示例与类或原型only-a-module.js无关:

const privateHello = 'hello' // <- module code (private)
export const publicHello = 'hello'; // <- module code (public)

使用类的模块示例,module-that-exports-a-class.js

export class Classes { // <- module AND class code (public)
    private privateHello = 'hello'; // <- class code (private)
    public publicHello = 'hello'; // <- class code (public)
} // <- class code (public)
const anotherPrivateHello = 'hello'; // <- module code (private)
export const anotherPublicHello = 'hello'; // <- module code (public)

在上面的示例中,私人

使用原型module-that-exports-a-prototype.js的模块示例:

export function Prototypes() { // <- module AND prototype code (public)
    const privateHello = 'hello'; // <- prototype code (private)
    this.publicHello = 'hello'; // <- prototype code (public)
} // <- prototype code (public)
const anotherPrivateHello = 'hello'; // <- module code (private)
export const anotherPublicHello = 'hello'; // <- module code (public)

这使来自OOP语言的初学者感到困惑的是,例如,在Java中,将类文件(file.class)自动导出为类,默认情况下,这是Java的方式作品。 JavaScript中不是这种情况。您必须声明要导出的内容。

类是一种尝试实现所谓的classical inheritance的尝试,而原型是prototypal inheritance。这是处理 代码重用 和保持其 自己状态 的对象的两种方法。

如果我们想使事情变得更加复杂,那么一个很好的后续问题是OOP vs. functional programming。但是您可以在其他地方阅读。

答案 2 :(得分:-2)

我会告诉你我所看到的。 这是一种工作nodejs的方法

IndexController =()=&gt; {}

IndexController.index =(req,res,next){   .... }

但这是在nodejs中工作的其他方式

Class IndexController(){     Def myFunction(){      ....     }

}

特权有什么不同吗?为什么要以这样不同的方式工作?