当前位置: 首页 > 面试题库 >

Javascript是一种基于原型的语言,这意味着什么?

翟俊哲
2023-03-14
问题内容

据说Javascript的主要优点之一是它是一种基于原型的语言。

但是,Javascript是基于原型的,这意味着什么?为什么这是优点?


问题答案:

原型继承 是一种面向对象的 代码重用形式
。Javascript是使用原型继承的仅有的[主流]面向对象语言之一。几乎所有其他面向对象的语言都是经典的。

经典继承中
,程序员编写一个类,该类定义一个对象。可以从同一类中实例化多个对象,因此您将代码放在一个位置,该代码描述了程序中的多个对象。然后可以将类组织成一个层次结构,以促进代码重用。更通用的代码存储在较高级别的类中,较低级别的类从中继承。这意味着一个对象正在与同一类的其他对象及其父类共享代码。

原型继承 形式中,对象 直接 从其他对象 继承
。关于类的所有业务都消失了。如果需要对象,则只需编写一个对象。但是代码重用仍然是很有价值的事情,因此允许将对象按层次结构链接在一起。在javascript中,每个对象都有指向创建它的对象的秘密链接,形成一个链。当要求对象提供其不具有的属性时,将询问其父对象…一直在链上,直到找到该属性或到达根对象为止。

JavaScript中的每个函数(本身就是对象)实际上都有一个称为“原型”的成员,该成员负责在请求对象时提供值。具有此成员可以使构造函数机制(通过该机制从函数构造对象)起作用。向功能对象的原型添加属性将使其对构造的对象以及从该对象继承的所有对象可用。

优点

关于原型继承为何是代码重用的一种有利形式,可能并没有一个严格的规则。代码重用本身是有利的,而原型继承是实现它的明智方式。您可能会争辩说,原型继承是代码重用的相当
简单的模型 ,并且代码可以 直接方式 大量重用。但是古典语言当然也可以做到这一点。

旁注: @Andrew Hedges
提出了一个很好的观点,那就是实际上有许多原型语言。值得一提的是,其他的存在,但也没有一个接近主流。NewtonScript似乎有一段时间受到关注,但因其平台而死。也可以通过添加原型功能来扩展某些现代语言。



 类似资料:
  • 我想创建一个

  • 看着新的Azure cosmos数据库,我对它的多模型特性有点困惑。具体而言,这是否意味着: a)相同的底层数据库/存储可以以多种方式并发查询,以便我可以对相同的集合使用gremlin图查询和mongodb api。 或 b)这是否意味着您可以在预配Cosmos DB时选择不同的模型(图、键值、列、文档),这就是从那时起存储数据的方式。 小册子让它听起来像a),但使用Azure仪表板创建cosmo

  • 问题内容: 在一个JavaScript文件中,我看到了: 声明并分配给它的目的是什么? 问题答案: 我将以一个插图开始这个答案: 我的回答最初是用jQuery演示的,只是略有不同: 由于在通过调用新函数更改范围时会经常更改,因此无法使用原始值访问原始值。将其别名为可以使您仍然访问的原始值。 就个人而言,我不喜欢使用as作为别名。它指的是什么几乎是不明显的,特别是如果函数长于几行。我 总是 使用更具

  • 问题内容: 原始浮点值怎么可能是?这意味着什么? 我可以取消该功能吗? 当我有: 然后返回,也是如此。但是当我打印时,它会打印。 问题答案: 因为Java使用IEEE浮点算术标准(IEEE 754)来定义-0.0和使用它。 可表示的最小数字在次正规有效位中没有1位,并且被称为正负零,由正负号确定。它实际上表示在零到相同符号的最小可表示非零数字之间的范围内将数字四舍五入为零,这就是为什么它有一个符号

  • 问题内容: 如果有Type [],则只能在其中存储Type或其子类型。ArrayList也是如此。那么为什么说一个是同质的而另一个却不是呢? 问题答案: 数组对添加的元素的类型进行运行时检查。也就是说,如果添加了一个不同类型的新元素,则在运行时将引发。这就是为什么它们被认为是“本地的”。 对于s(通常是s)而言,情况并非如此。由于在运行时进行类型擦除,因此它实际上可以容纳任何对象。 运行时,以下内