在 JS 中为什么要少用 class ?
时间:2026-4-28 23:39 作者:独元殇 分类: 前端技术
先讨论一下使用类的意义。
使用类的意义
这个得先回到 C 的时代。现在你要搞 一个功能,比如说把一个元素放到一个容器里,栈。
栈就像我们吃饭用的盘子,在我们餐厅柜子里一摞,我们只能从顶部放入或取出。
为了实现它,就需要:
一个数组偷偷存数据(私有状态),几个内部方法管理这个数组。
但是有一定复杂度了,索性把它当做一个箱子来看待,对外只暴露 push / pop 这两个操作。
用户不需要知道里面怎么存的,我们也可以随时改内部实现,外部代码不受影响。
这就是面向对象封装的核心思想。
类的概念就出自这里。
但慢慢搞复杂了
但编程业界对这个封装实现愈发追捧。
到了 Java 时代,完蛋哈哈,不再允许不通过类来声明procedure或function 了.... (C# 也是)
封装思想倒没什么坏处,但是有点过分了。 人们在尝试阻止新手使用【过程式编程】。
其实,有点搞的过于复杂了,为了实现一个简单的功能,还得考虑状态等等乱七八糟的。
当然,也不是没有好处。如果说几千个人去维护一个代码库,Java 这种做法,能尽可能的保证代码组织良好,让人人写出来的都利于维护。。。 就是费劲。
JavaScript 和 typescript
开始 JS 从诞生到现在,就一直是一个保持简单的思想。
es6 里出现更标准的 class ,只是为了迎合习惯,并不是推荐使用。(ts 也一样)
在 JS 里,相当不推荐使用类 class ,因为那个奇奇怪怪,很难用的 this 。
在 Java 里用习惯 this 了,在 JavaScript 里,你会经常发现 this 失灵。比如你把某个 class 的一个 方法作为回调传递给函数,你会发现 this 访问不到了....
class User {
constructor(name) {
this.name = name;
}
greet() {
console.log(`Hi, I'm ${this.name}`);
}
}
const user = new User('张三');
user.greet(); // Hi, I'm 张三
setTimeout(user.greet, 100); // Hi, I'm undefined 卧槽!!!
这个在 Java 里是永远也不会发生的。
为什么,JS 本身就不是一个为封装性发明的语言 ,这个 类 是个语法糖,有点假 类!
在 JS 里,需要什么,就创建函数就行了。
当然,有意思的是,JS 也不是函数语言:
const arr = [3, 1, 2];
function functionA(a) { return a.sort(); } // 修改原数组
function functionB(a) { return a[0]; } // 期望拿到最小值 1,结果拿到排序后的第一个
functionA(arr); // arr 已被改为 [1, 2, 3]
console.log(functionB(arr)); // 输出 1,但如果 arr 是 [3,1,2] 本应输出 3
是不是很气! functionB 从未调用过 sort(),但它的结果已经被 functionA 的副作用悄悄改变了。JS 连函数参数不可变性 都没有!
总结一下吧
其实,我也不主张永远不要在 JS 里使用类,我们应该为合适的项目选择合适的工具。
JS 本身就不完美兼容类,JS 有自己的思想脾气。
类 class 只是 JavaScript 原型系统的语法糖。实在是复杂,需要封装的可以用用,但:
能用简单数据结构 + 函数就解决的,就用类。
使用 JS,最后还是使用更先进的框架这种更符合人们摸索出来的 JS 的最合适的使用方法。
比如 React 的 function component + hooks,
Vue 的 Composition API 。
什么时候用 class 呢?比如 可复用组件的“公开 API 类型” ,这种可以。其余的环境,尽量避免。