Javascript 是一种基于原型的语言是什么意思?

IT技术 javascript oop inheritance prototype-programming
2021-01-21 07:34:28

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

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

6个回答

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

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

原型继承形式中,对象直接从其他对象继承所有关于课程的事情都消失了。如果你想要一个对象,你只需编写一个对象。但是代码重用仍然是一件有value的事情,因此允许对象在层次结构中链接在一起。在javascript中,每个对象都有一个指向创建它的对象的秘密链接,形成一个链。当一个对象被要求提供一个它没有的属性时,它的父对象将被要求......不断地向上链直到找到该属性或直到到达根对象。

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

好处

关于为什么原型继承是代码重用的一种有利形式,可能没有硬性规定。代码重用本身是有利的,原型继承是一种明智的方法。您可能会争辩说,原型继承是一种相当简单的代码重用模型,并且可以通过直接方式大量重用代码但是古典语言当然也能做到这一点。

旁注: @Andrew Hedges提出了一个很好的观点,实际上有很多原型语言。值得注意的是,这些其他的存在,但也值得注意的是,它们都不是主流。NewtonScript 似乎有一段时间的吸引力,但随着它的平台消亡。也可以通过添加原型功能的方式扩展一些现代语言。

+1 一个很好的答案。一个小评论:对我来说,经典继承似乎比原型继承更“直接”。事实上,我真的认为原型对象仅仅是(到其他对象的)链接,而在编译的 OOP 中,我认为基类是“直接继承的”。因此,原型对象被链接在一起而不是继承(继承有点伪造)。有什么想法吗?
2021-03-15 07:34:28
嘿凯利。虽然 JavaScript 是迄今为止最流行的原型语言,但还有许多其他语言:en.wikipedia.org/wiki/Prototype-based_programming#Languages
2021-03-21 07:34:28
@PrisonerZERO:我认为原型继承比经典继承更直接。对象 B 不是指向从对象 A 指向的类继承的类,而是直接指向对象 A 并说“我就像那个对象,除了……”。原型继承最重要的事情,也是大多数人似乎最难理解的事情,是它不区分实例和类型。每个对象既是类型又是实例。两者之间的区别是人为和故意的,通常是卡在以阶级为导向的心态中的症状。
2021-03-29 07:34:28
嘿安德鲁。好点子。我应该更清楚。我会记录下来。
2021-04-07 07:34:28
2021-04-12 07:34:28

一种基于原型的语言,不区分类和对象:它只有对象。基于原型的语言具有原型对象的概念,该对象用作模板,从中获取新对象的初始属性。任何对象都可以在创建时或运行时指定自己的属性。此外,任何对象都可以关联为另一个对象的原型,从而允许第二个对象共享第一个对象的属性。

一个很好的解释,但对“初始属性模板”的评论有点误导。如果在实例化一个对象后更改原型,该对象仍会接收这些函数。
2021-03-29 07:34:28

基于原型的编程是一种面向对象的编程风格,其中不存在类,行为重用(或基于类的语言中的继承)是通过克隆作为原型的现有对象来执行的。

你还有这种感觉吗?因为如果是这样,那么这是第一个真正坚定地与我“点击”的解释。
2021-04-07 07:34:28

优点/缺点是,我们可以在运行时创建新类型的对象,而无需定义类(静态代码)。与大多数功能一样,开发人员可以将其转化为优势/劣势。

以上是可能的,因为对象本质上是 java 脚本中的函数(也是闭包)。

动态对象是 javascript 的一个好处,但它们与作为原型语言或函数式语言的 javascript 并没有真正相关。在许多经典语言中,您可以在运行时创建动态对象。闭包也有些无关。
2021-04-08 07:34:28
类不一定是静态代码 - 看看 Python,其中类本身就是对象,并且由元类构造而成,元类也是对象。
2021-04-09 07:34:28

看完所有答案后,这是结论

1) 对象直接从其他对象继承的继承

2)不使用类

3) 也称为基于实例的编程或面向无类原型的编程

4)行为重用是通过克隆作为原型的现有对象来执行的

5) 用作模板的对象从新对象获得初始属性