文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

请停止在JavaScript中使用类,你将成为一名更好的开发人员

2024-12-11 17:19

关注

ES6之前的classes

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

  1. // "class" 声明 
  2. function Car(make, model) { 
  3.   this.make = make; 
  4.   this.model = model; 
  5.  
  6. // 启动方法 
  7. Car.prototype.start = function() { 
  8.   console.log('vroom'); 
  9.  
  10. // 覆盖toString方法 
  11. Car.prototype.toString = function() { 
  12.   console.log('Car - ' + this.make + ' - ' + this.model); 
  13.  
  14. // 继承实例 
  15. function SportsCar(make, model, turbocharged) { 
  16.   Car.call(this, make, model); 
  17.   this.turbocharged = turbocharged; 
  18.  
  19. // 实际继承逻辑 
  20. SportsCar.prototype = Object.create(Car.prototype); 
  21. SportsCarSportsCar.prototype.constructor = SportsCar; 
  22.  
  23. // 覆盖启动方法 
  24. SportsCar.prototype.start = function() { 
  25.   console.log('VROOOOM'); 
  26.  
  27. // 现在测试课程 classes 
  28. var car = new Car('Nissan', 'Sunny'); 
  29. car.start(); // vroom 
  30. console.log(car.make); // Nissan 
  31.  
  32. var sportsCar = new SportsCar('Subaru', 'BRZ', true); 
  33. sportsCar.start(); // VROOOOM 
  34. console.log(car.turbocharged); // true 

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

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

访问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数据结构。就是这样。当我说一切都是对象时,我是说真的:甚至函数都是对象。你可以通过以下代码片段进行检查:

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

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

  1. class Car { 
  2.   constructor(make, model) { 
  3.     this.make = make; 
  4.     this.model = model; 
  5.   } 
  6.    
  7.   start() { 
  8.     console.log('vroom'); 
  9.   } 
  10.    
  11.   toString() { 
  12.     console.log(`Car - ${this.make} - ${this.model}`); 
  13.   } 
  14.  
  15. class SportsCar extends Car { 
  16.   constructor(make, model, turbocharged) { 
  17.     super(make, model); 
  18.     this.turbocharged = turbocharged; 
  19.   } 
  20.    
  21.   start() { 
  22.     console.log('VROOOOM'); 
  23.   } 
  24.  
  25.  
  26. // 实际用法保持不变 
  27. var car = new Car('Nissan', 'Sunny'); 
  28. car.start(); // vroom 
  29. console.log(car.make); // Nissan 
  30.  
  31. var sportsCar = new SportsCar('Subaru', 'BRZ', true); 
  32. sportsCar.start(); // VROOOOM 
  33. console.log(car.turbocharged); // true 

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

为什么不?

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

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

 

来源:web前端开发内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯