我根本不使用 JavaScript 类。我是不是错过了什么?

2025-06-07

我根本不使用 JavaScript 类。我是不是错过了什么?

如果你花时间阅读 JavaScript 相关知识并关注最新的在线内容,你会发现很多讨论都围绕着类展开。但是,如果你不使用它们,你可能会觉得自己“固步自封”。如果不使用类,你会错过什么呢?

值得庆幸的是,即使没有类,也绝对可以编写正确、可扩展的代码。很少有情况需要使用类。

此外,JavaScript 中的类与其他语言(例如 Java)之间存在细微的差别。这种细微的差别可能会造成混淆,并引入难以发现的错误。处理类意味着你必须处理令人畏惧的this关键字。

作为一种多范式语言,JavaScript 也能很好地与函数式编程的特性兼容。你可以:

组合函数,调用一个函数,并将返回值传递给另一个函数:

functionA(functionB(value))
Enter fullscreen mode Exit fullscreen mode

部分应用函数,仅使用部分参数调用函数。它返回一个可以使用剩余参数调用的函数:

function flowerColour(flowerType, colour) {
  return `${flowerType} are ${colour}`
}

/* Call `flowerColour` partially, setting the 
  `flowerType` argument to "Roses" */
const rosesAre = flowerColour.bind(null, "Roses")

console.log(rosesAre("red")) // Returns "Roses are red"
Enter fullscreen mode Exit fullscreen mode

使用和创建高阶函数,这些函数以函数作为参数或返回函数:


/* Map is a higher-order function, because
   it takes a function as an argument */

// Returns [10, 16, 37, 9]
[20, 32, 74, 18].map(number => number / 2)


/* Another higher order function, in this
   case, it returns a function */
function createLuckyNumber(name) {
  const luckyNumber = parseInt(10000 * Math.random())
  return function() {
    return `${name}'s lucky number is ${luckyNumber}`
  }
}

const emmasLuckyNumber =  createLuckyNumber("Emma")
const joesLuckyNumber = createLuckyNumber("Joe")

// Returns "Emma's lucky number is 7280"
console.log(emmasLuckyNumber())

// Returns "Joe's lucky number is 2971"
console.log(joesLuckyNumber())
Enter fullscreen mode Exit fullscreen mode

最后一个例子创建了一个闭包。当你在函数内部创建一个函数时,就创建了一个闭包。这个内部函数可以访问父函数中的变量。闭包是内部函数和父函数中变量的组合。

例如,当你调用 时createLuckyNumber,它会读取姓名,创建幸运数字,并返回一个内部函数。即使在createLuckyNumber调用 之后,内部函数仍然可以读取该人的姓名和幸运数字。闭包是类中私有字段的替代方案。

使用这些功能工具,您还可以使用 Lodash 等库进行扩展,无需类即可编写可读、高性能和可扩展的代码。

什么让课程变得有趣

在某些情况下我会使用类,而且我认为这是最好的使用方法。当你想将一个复杂的任务与应用程序的其他部分隔离开来时,类是很好的选择。

这种类就像一个“黑匣子”。这是因为代码库的其余部分不知道(也不关心)对象内部是如何工作的。

它的大部分属性都是私有的。其中一些可能是公共的,除非绝对必要,否则这些属性不能从对象外部更改。这是因为这可能会扰乱对象的内部运作。

(请注意,JS 仍然不支持私有成员,在这种情况下,我只是不会从类外部访问它们。)

除非绝对必要,否则应避免使用 setter 方法,因为它与从外部更改对象的属性相同。

当您需要对象的某些功能时,您可以调用其中一种公共方法,该方法执行操作并返回所需的值。

公共方法由对象可以执行的动作和操作组成。例如,在Car类中,拥有accelerate方法比……更好setSpeed

但归根结底,这是一种管理内部状态的方法,因为对象的私有属性就是它的状态。因此,我不会在包含状态管理库的项目中用到类。所以即使在这种情况下,类也并非必需的。


附言:你喜欢读到的内容吗?每周我都会发送一封电子邮件,其中包含免费的技巧和见解,帮助你成为更优秀的 JavaScript 开发者。如果你感兴趣,请点击此处订阅

文章来源:https://dev.to/nicozerpa/i-don-t-use-javascript-classes-at-all-am-i-missing-out-on-something-4h2a
PREV
O(n*log n) 是什么?学习大 O 对数线性时间复杂度
NEXT
使用此模板撰写更好的 PR 📄