我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JavaScript中的类有什么问题

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JavaScript中的类有什么问题

这篇文章主要介绍“JavaScript中的类有什么问题”,在日常操作中,相信很多人在JavaScript中的类有什么问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript中的类有什么问题”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

并不是说 JS 的类有问题,但是如果你使用该语言已有一段时间,特别是使用过ES5,那么你可能就知道了从原型继承到当前类模型的演变。

原型链会有什么问题?

以我的拙见,这个问题的答案是:没有。但是社区花了很多年的时间才将类的概念强加到不同的结构和库中,因此ECMA技术委员会决定无论如何都要添加它。

你会问,这有什么问题吗?这就是他们真正做的,在我们已经拥有的原型继承之上添加了一些构成,并决定将其称为类,这反过来又让开发人员认为他们正在处理一种面向对象的语言,而实际上它们并不是。

类只不过是语法糖

jS 没有完全的 OOP 支持,它从来没有,这是因为它从来都不需要它。

表面上,当前版本的类显示OOP范例,因为:

  • 我们可以创建基本的类定义,用非常经典的语法将状态和行为分组在一起。

  • 我们可以从一个类继承到另一个类。

  • 我们可以在公有和私有之间定义属性和方法的可见性(尽管私有字段仍然是一个实验性的特性)。

  • 我们可以为属性定义getter和setter。

  • 我们可以实例化类。

那么为什么我说类是语法糖呢?因为尽管在表面上,它们看起来是非常面向对象的,但是如果我们试图做一些超出它们可能的事情,比如定义一个类扩展两个类(目前不可能的事情),我们需要使用下面的代码

// 辅助函数 function applyMixins(derivedCtor, baseCtors) {     baseCtors.forEach(baseCtor => {         Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {             let descriptor = Object.getOwnPropertyDescriptor(baseCtor.prototype, name)             Object.defineProperty(derivedCtor.prototype, name, descriptor);         });     }); }  class A {   methodA () {     console.log('A')   } }  class B {   methodB () {     console.log('B')   } }  class C {  }  // 使用 mixins

我们需要这样做,因为在JS中我们无法编写:

class A {      methodA(){         console.log("A")     } }  class B {      methodB(){         console.log("B")     } }  class C extends A, B {  }

在上面的示例中,关键部分应该是applyMixins函数。如果,你没有完全理解它试图做什么,但可以清楚地看到它正在访问所有类的原型属性来复制和重新分配方法和属性。这就是我们需要看到真相的地方:类只不过是在经过验证的原型继承模型之上的语法糖。

这是否意味着我们应该停止使用类?当然不是,重要的是要理解它,而且如果我们想做些突破类的限制,那么我们就必须用原型来处理。

JS 的OOP 模型缺失了什么呢?

如果我们当前的OOP模型是如此之薄,仅是原型继承的抽象层,那么我们到底缺少什么呢?是什么让JS真正成为OOP?

看这个问题的一个好方法就是看看TypeScript在做什么。该语言背后的团队通过创建一些可以翻译成JS的东西,无疑将 JS  推向了极限。这反过来也限制了它们的能力。

目前 JS 中缺失的一些OOP构造具有内在的类型检查功能,在动态类型语言中没有真正的意义,这可能是它们还没有被添加的原因。

接口

接口可帮助定义类应遵循的API。接口的主要好处之一是,我们可以定义实现相同接口的任何类的变量,然后安全地调用其任何方法。

interface Animal {   speak() }  class Dog implements Animal{   speak() {     console.log("Woof!")   } }  class Cat implements Animal{   speak() {     console.log("Meau!")   } }  class Human implements Animal{   speak() {     console.log("Hey dude, what's up?")   } }  //如果我们在JS中有接口,我们可以放心地做: let objects = [new Dog(), new Cat(), new Human()] objects.forEach(o => o.speak())

当然,我们可以通过定义speak方法并覆盖它的类来实现同样的目的,但接口更加清晰和优雅。

抽象类

每当我尝试对我的代码进行完整的OOP操作时,我肯定会错过JS中的抽象类。抽象类是定义和实现方法的类,但永远不会实例化。这是一种可以扩展但从未直接使用的常见行为的分组方式。这是一个很好的资源,并且绝对可以在当前JS领域内实现而不会花费太多精力。

静态多态

静态多态性使我们可以在相同的类中多次定义相同的方法,但是具有不同的签名。换句话说,重复该名称,但要确保其接收不同的参数。现在我们有了JS的rest参数,这使我们可以拥有一个任意数字,但是,这也意味着我们必须在方法中添加额外的代码来处理这种动态性。相反,我们可以更清楚地区分方法签名,则可以将相同行为的不同含义直接封装到不同方法中。

JavaScript中的类有什么问题

左边的版本不是有效的JS,但它提供了一个更干净的代码,因此,阅读和理解起来比较容易。右边的版本是完全有效的,它阅读起来相对困难些,还要懂得一些 ES6  的语法。

多态性通常是通过查看方法中接收到的参数的类型来实现的。但是,由于JS的工作原理,我们知道这是不可能的。

到此,关于“JavaScript中的类有什么问题”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

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

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

JavaScript中的类有什么问题

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JavaScript的问答题有哪些

这篇文章主要介绍“JavaScript的问答题有哪些”,在日常操作中,相信很多人在JavaScript的问答题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript的问答题有哪些”的疑惑有所
2023-06-27

JavaScript为什么没有类的概念?

JavaScript是一种面向对象的编程语言,但与传统的面向对象语言不同的是,它没有类的概念。这是许多开发人员在学习JavaScript时经常遇到的困惑之一,因为许多其他编程语言如Java、C++、Python等都具有类的概念,而且在这些语言中,类是面向对象编程的重要组成部分。那么,JavaScript为什么没有类的概念?这是因为JavaScript是一种基于原型继承的语言,与
2023-05-14

Javascript有什么Math数学类

小编给大家分享一下Javascript有什么Math数学类,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!说明1、random()返回0 ~ 1之间的随机数。[ 0
2023-06-20

javascript中原始类型和引用类型有什么区别

小编给大家分享一下javascript中原始类型和引用类型有什么区别,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、区别(1)原始类型存储的是值,引用类型存储的
2023-06-15

Javascript基础中的十个重要问题分别是什么

Javascript基础中的十个重要问题分别是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.什么是Javascript?Javascript是一种用于W
2023-06-22

JavaScript的面试问答题有哪些

本篇内容介绍了“JavaScript的面试问答题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!JavaScript的数据类型都有什么?
2023-06-27

编程热搜

目录