支持JavaScript方法



我是JavaScript的新手,来自Java背景。我只是在玩NodeJS("type": "module"(Express框架,但在用JS编写方法的两种方法之间左右为难。

以下是示例(在线查看注释(。

类型1:

main.js

const method1 = () => {
...
method2();
...
};
const method2 = () => {
// this is not exported, so it works as a private method and won't be accessible in other JS files
...
};
.
.
.
// likewise there can be many other methods here
export { method1 }; // export other methods as well

然后,我可以在任何其他JS文件中使用method1(不能使用method2,因为它没有导出(,如下所示:

test.js

import { method1 } from './main.js';
method1();

类型2:

main.js

class Main {

method1() {
...
method2();
...
}
#method2() {
// this is a private method, so won't be accessible outside of this class
...
}
// likewise other methods here
}
const main = new Main();
export default main;

然后,我可以在任何其他JS文件中使用这个类实例,如下所示:

test.js

import main from './main.js';
main.method1();

我想知道这两者之间的区别,什么时候使用,哪个更好

这两种方法都能很好地工作,但类型2有点奇怪,因为您只使用来阻止导出某些内容。

类通常用于将数据(类实例上的属性(与对该数据进行操作的方法分组在一起。举个愚蠢的例子:

class NumberMultiplier {
constructor(num) {
this.num = num;
}
multiply(mult) {
return this.num * mult;
}
}
const n = new NumberMultiplier(5);
console.log(n.multiply(10));

上面有数据(this.num(,还有一个对数据进行操作的方法(multiply(。

但在您的情况下,您不希望有实例数据——您只想将函数分组在一起,实际上没有理由使用类。你可以考虑单独定义函数——就像你在第一个片段中所做的那样——或者你可以使用一个导出的普通对象,只需要你需要的属性:

const method2 = () => {
};
export default {
method1() {
method2();
}
};

如果确实具有持久性数据,并希望将其放在类实例上,则可以使用类和#私有方法(使用new创建一个实例,然后导出该实例就是一个单例(。

需要注意的一个潜在问题是,如果对对象使用export default,则在单行中导入时无法提取导出的单个属性。也就是说,如果你只有一个默认的导出,你就不能做像这样的事情

import { method1 } from './main.js'.default;

你只能做

import theObj from './main.js';
const { method1 } = theObj;

有些人会认为这看起来有点难看。拥有独立的命名导出可以让模块的使用者更容易地在一行中将他们需要的内容导入到独立的标识符中。

JS中的类与您熟悉的Java不同,在没有明确必要的情况下很少使用。然而,在某些情况下,JS中的OOP可能非常有用。

基本上,如果你只做一般的JS编程,比如前端网站或应用程序,那么第一种方法(Type1(是你99%的时间都要使用/看到的方法。

然而,如果你正在制作游戏,你可以使用OOP来更好地控制游戏中的不同角色/对象。

就后端或基础设施级别而言,这确实取决于情况。如果您遵循MVC设计模式,则可以完美地使用类(类型2(,但这也是可选的。

归根结底,这取决于你自己的设计选择。您可以在JS中随时选择FP(T1(或OOP(T2

这实际上取决于您要导出的内容。如果只导出一个或几个对象,则类型1更合适。使用type1,您可以导出任何基元类型的变量或对象,并且可以直接在main.js.中使用

但是,如果要导出许多对象和/或变量,那么类型2是有意义的。对于类型2,所有导出都存储在一个对象中,因此您必须使用该对象来访问它们。就性能而言,两者是相同的。

最新更新