javascript module是否可以完全替代class?
大佬,能不能提供一种场景,就是说必须使用class,然后ES自带的module替代不了的。
我没想到,所以来这里提问
比如你想要一个private变量,可以弄一个在module弄一个变量,然后弄个function去改变它对吧,外面的module或者.js文件不能改变他。
如果你要override一个module里面的函数,也可以export import然后改写,对吧,这个感觉就跟extend class差不多了。我的js基础没有那么强。想要了解一下这类的场景。
或者哪些场景下面,class相比module是更好的最佳实践。
非常感谢~~
回复
1个回答
test
2024-07-01
取决于你具体的应用场景。某些场景下确实可以替代,某些场景下则不可以。
首先是语义不同,模块是模块,类是类。模块中一个不导出的变量、和一个类中私有的成员,虽然从实现上看差不多,但语义上并不相同,而语义其实是方便其他人理解你的项目结构的一个重要因素。但如果你并不纠结于语义问题,那么这点可以忽略。
其次是 ESM 虽然是“单例的”(也就是外部导入的始终是同一个模块的引用),但其他模块方案可未必是这样。就连 CJS 看似也是单例的,但其实是因为它默认是有类似 Memoize Cache 的机制的,但这种机制是可以被打破的。而有些时候你为了写更通用的库,虽然你是按 ESM 写的,但可能会需要构建输出成不同的模块方案,这种时候你就无法确保它一定单例的了。
最后是 OOP 问题。类的实例之间相互独立的,也就是你 new 两个类出来,这两个对象的私有成员之间是互不干扰的,并且如果你有子类、它们还会有继承关系。但模块因为前面提到的单例的缘故,你有一处改了,其他所有地方也都随着改了;而且你没办法实现类似继承的效果。
暂时先想到了这么多。
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容