千家信息网

为什么要停止在JavaScript中使用类

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,为什么要停止在JavaScript中使用类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。多年来,OOP(面向对象编程)是软件工程中的事实
千家信息网最后更新 2026年11月03日为什么要停止在JavaScript中使用类

为什么要停止在JavaScript中使用类,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

多年来,OOP(面向对象编程)是软件工程中的事实上的标准。类,多态性,继承和封装的概念主导了开发过程,并对其产生了革命性的影响。但是所有内容都有有效期限,其中包括编程范例。我将讨论为什么首先引入类,为什么在JavaScript中使用类是一个坏主意,以及一些替代方法。

ES6之前的classes

即使自ES6(ECMAScript 2015)起将class关键字添加到JavaScript中,人们仍在使用类。实现的方法是构造函数和原型委托。为了确切地说明我的意思,我将在ES5和ES6环境中实现相同的类。考虑一个继承自 Car 的 Car 和 SportsCar 类。两者都有品牌( make )、型号( model )属性和启动方式( start ),但SportsCar还有涡轮增压( turbocharged )属性,并覆盖启动方式(start)。

// "class" 声明 function Car(make, model) {   this.make = make;   this.model = model; }  // 启动方法 Car.prototype.start = function() {   console.log('vroom'); }  // 覆盖toString方法 Car.prototype.toString = function() {   console.log('Car - ' + this.make + ' - ' + this.model); }  // 继承实例 function SportsCar(make, model, turbocharged) {   Car.call(this, make, model);   this.turbocharged = turbocharged; }  // 实际继承逻辑 SportsCar.prototype = Object.create(Car.prototype); SportsCarSportsCar.prototype.constructor = SportsCar;  // 覆盖启动方法 SportsCar.prototype.start = function() {   console.log('VROOOOM'); }  // 现在测试课程 classes var car = new Car('Nissan', 'Sunny'); car.start(); // vroom console.log(car.make); // Nissan  var sportsCar = new SportsCar('Subaru', 'BRZ', true); sportsCar.start(); // VROOOOM console.log(car.turbocharged); // true

你可能已经猜到了,Car(第2行)和 SportsCar(第18行)函数是构造函数。使用此关键字定义属性,并使用 new 创建对象本身。如果你不熟悉 prototype,则这是每个JS对象都必须委派常见行为的特殊属性。例如,数组对象的原型具有你可能熟知的函数:map,forEach,find等。字符串原型具有功能replace,substr等。

在第33行上创建Car对象之后,可以访问其属性和方法。从第34行开始的调用导致以下操作:

  • JS引擎要求 car 对象提供一个键为 start 的值。

  • 对象回应说它没有这样的值。

  • JS引擎向 car.prototype 对象询问以键 start 开头的值。

  • car.prototype 返回JS引擎立即执行的 start 函数。

访问make和model属性的操作类似,只是它们是直接在汽车对象上定义的,而不是原型。

继承有点棘手,它在第24-25行处理。这里最重要的函数是 Object.create 函数,它接受一个对象并返回一个全新的对象,其原型设置为作为参数传递的对象。现在,如果JS引擎在 sportsCar 对象或 sportsCar.prototype 上没有找到一个值,它将查阅 sportsCar.prototype.prototype 是 Car 对象的原型。

ES6 Class关键字

随着2015年ES6的发布,人们期待已久的 class 关键字出现在JavaScript中。这是应社区的多次要求而做的,因为人们对来自面向对象的语言感到不适应。但他们忽略了一个重要的问题。

JavaScript不知道什么是类

JavaScript不是一门面向对象的语言,它不是被设计成这样的语言,类的概念绝对不适用于它。虽然JS中的所有内容确实都是对象,但这些对象与Java或C#中的对象不同。在JS中,对象只是具有某种复杂查找过程的Map数据结构。就是这样。当我说一切都是对象时,我是说真的:甚至函数都是对象。你可以通过以下代码片段进行检查:

function iAmAnObject() {}  console.log(iAmAnObject.name); // iAmAnObject console.log(Object.keys(iAmAnObject)); // Array []

好的,这一切都很好,但是 class 关键字如何工作呢?很高兴你问。你还记得前面的 Car 和 SportsCar 示例吗?好吧,class 关键字只是最重要的语法糖。换句话说,类在概念上产生相同的代码,并且仅用于美学和可读性目的。正如我之前所承诺的,这是ES6中这些相同类的示例:

class Car {   constructor(make, model) {     this.make = make;     this.model = model;   }      start() {     console.log('vroom');   }      toString() {     console.log(`Car - ${this.make} - ${this.model}`);   } }  class SportsCar extends Car {   constructor(make, model, turbocharged) {     super(make, model);     this.turbocharged = turbocharged;   }      start() {     console.log('VROOOOM');   } }   // 实际用法保持不变 var car = new Car('Nissan', 'Sunny'); car.start(); // vroom console.log(car.make); // Nissan  var sportsCar = new SportsCar('Subaru', 'BRZ', true); sportsCar.start(); // VROOOOM console.log(car.turbocharged); // true

这些示例相同,并且产生相同的结果,有趣的是,它们在后台生成(几乎)相同的代码。

为什么不?

现在,你应该了解JS中的类是什么以及它们如何工作。现在,凭借所有这些知识,我可以解释为什么在JS中使用类是一个坏主意。

  • 绑定问题。由于类构造函数与这个关键字密切打交道,它可能会引入潜在的绑定问题,特别是当你试图将你的类方法作为回调传递给外部例程时(你好,React开发人员)。

  • 性能问题。由于类的实现,众所周知,它们很难在运行时进行优化。虽然目前我们享受着高性能的机器,但摩尔定律正在逐渐消失的事实可以改变这一切。

  • 私有变量。首先,私有变量的最大优点和主要原因之一就是类在JS中不存在。

  • 严格的层次结构。类直接引入了从上到下的顺序,使得更改更难实现,这在大多数JS应用程序中是不可接受的。

  • 因为React团队会告诉你不要这样做。虽然他们还没有明确废弃基于类的组件,但很可能在不久的将来就会废弃。

所有这些问题都可以通过JS对象和原型委托得到缓解。 JS提供了这么多类所能做的事情,但大多数开发者却对此视而不见。如果你想真正掌握JS,你需要接受它的理念,摆脱教条式的类思维。

看完上述内容,你们掌握为什么要停止在JavaScript中使用类的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

对象 函数 方法 关键 关键字 原型 问题 相同 属性 内容 引擎 重要 人们 代码 只是 概念 示例 语言 这是 开发 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网产品 网络科技有限互联网 北京互联网络科技有限公司 时间互联网络科技 互联网科技股午盘股票涨跌 广州优美互联网科技 欧洲十大科技互联网公司 互联网公司科技股 宝灵互联网科技有限公司 深圳市优智互联网科技有限公司 高科技互联网发展前景如何 合肥互联网科技公司公章图片 云南省自由互联网科技有限公司 厦门江牛科技互联网 2021世界互联网领先科技成果发布 陕西九四连强互联网科技有限公司 米泉互联网科技专业怎么样 互联网科技创新创业项目 互联网科技创新方面的资料 前海云享互联网科技 广东万易互联网科技有限公司惠州分公司 互联网科技保险 一五八零互联网科技 左右互联网络科技 小米互联网科技园设置 移动互联网年度科技创新 浙南科技城互联网大厦建设工程 特约风豹互联网科技为什么扣费 科技互联网的核心竞争力 互联网营销推广黑科技
0