javascript module是否可以完全替代class?

作者站长头像
站长
· 阅读数 7

大佬,能不能提供一种场景,就是说必须使用class,然后ES自带的module替代不了的。

我没想到,所以来这里提问

比如你想要一个private变量,可以弄一个在module弄一个变量,然后弄个function去改变它对吧,外面的module或者.js文件不能改变他。

如果你要override一个module里面的函数,也可以export import然后改写,对吧,这个感觉就跟extend class差不多了。我的js基础没有那么强。想要了解一下这类的场景。

或者哪些场景下面,class相比module是更好的最佳实践。

非常感谢~~

回复
1个回答
avatar
test
2024-07-01

取决于你具体的应用场景。某些场景下确实可以替代,某些场景下则不可以。

首先是语义不同,模块是模块,类是类。模块中一个不导出的变量、和一个类中私有的成员,虽然从实现上看差不多,但语义上并不相同,而语义其实是方便其他人理解你的项目结构的一个重要因素。但如果你并不纠结于语义问题,那么这点可以忽略。

其次是 ESM 虽然是“单例的”(也就是外部导入的始终是同一个模块的引用),但其他模块方案可未必是这样。就连 CJS 看似也是单例的,但其实是因为它默认是有类似 Memoize Cache 的机制的,但这种机制是可以被打破的。而有些时候你为了写更通用的库,虽然你是按 ESM 写的,但可能会需要构建输出成不同的模块方案,这种时候你就无法确保它一定单例的了。

最后是 OOP 问题。类的实例之间相互独立的,也就是你 new 两个类出来,这两个对象的私有成员之间是互不干扰的,并且如果你有子类、它们还会有继承关系。但模块因为前面提到的单例的缘故,你有一处改了,其他所有地方也都随着改了;而且你没办法实现类似继承的效果。

暂时先想到了这么多。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容