«

在 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 类型” ,这种可以。其余的环境,尽量避免。

标签: 原创 JS