这是什么意思,Javascript是一个基于原型的语言?

Javascript的主要优势之一是据说这是一个基于原型的语言。

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

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

经典的inheritance中 ,程序员写一个定义一个对象的类。 多个对象可以从同一个类实例化,所以你的代码在一个地方描述了你的程序中的几个对象。 然后可以将类组织到一个层次结构中,进一步实现代码重用。 更一般的代码存储在更高级别的类中,从中inheritance更低级别的类。 这意味着一个对象与同一个类的其他对象以及它的父类共享代码。

原型inheritanceforms中,对象直接从其他对象inheritance 。 所有关于阶级的事业都消失了。 如果你想要一个对象,你只需要写一个对象。 但是代码重用仍然是一件有价值的事情,因此允许对象在层次结构中链接在一起。 在JavaScript中,每个对象都有一个秘密链接到创build它的对象,形成一个链。 当一个对象被要求一个它没有的属性时,它的父对象将会被要求…不断地向上链,直到find属性或者直到达到根对象。

JavaScript中的每个函数(都是对象本身)实际上都有一个名为“prototype”的成员,它负责在对象被请求时提供值。 拥有这个成员允许构造函数机制(由函数构造对象)工作。 将一个属性添加到一个函数对象的原型中将使其对构造对象以及所有inheritance它的对象都可用。

优点

原型inheritance为什么是代码重用的有利forms,可能没有硬性规定。 代码重用本身是有利的,原型inheritance是一个明智的方法。 你可能会说,原型inheritance是一个相当简单的代码重用模型 ,而且代码可以直接重用。 但是古典语言当然也可以做到这一点。

旁注: @Andrew Hedges说得很好,实际上有很多原型语言。 值得注意的是,这些其他的存在,但也值得注意的是,他们都没有任何接近主stream。 NewtonScript似乎有一段时间的牵引,但死于平台。 还可以通过添加原型function的方式扩展某些现代语言。

一个基于原型的语言,不会将类与对象区分开来:它只是具有对象。 基于原型的语言具有原型对象的概念,该对象被用作从其获得新对象的初始属性的模板。 任何对象都可以在创build它时或在运行时指定它自己的属性。 另外, 任何对象都可以作为另一个对象的原型 ,从而允许第二个对象共享第一个对象的属性。

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

优点/缺点是,我们可以在运行时创build新types的对象,而不需要定义类(静态代码)。 像大多数function一样,开发者将其转化为优势/劣势。

以上是可能的,因为对象本质上是在Java脚本中的函数(也closures)。

您可以创build相同types的对象,而不必声明类结构,并且可以随时使用对象的原型将其添加到定义中。 这比正常的做事方式更灵活。

如果您只是在运行时使用对象,而不是编译时的类来构build新对象,则可以在不知道任何细节的情况下扩展对象。 当然,根据使用情况,它可能会很快变成缺点。 我对这里的语言没有任何的假设,所以它适用于JavaScript以外的语言,而不是dynamic的。

myobject.prototype=unkownobject; myobject.newproperty=1; 

你可以从任何地方得到这个物体。 你自己的代码,从networking,从数据库,从外部的联系等等。

请注意,一种语言不必像JavaScript那样实现原型inheritance。 在JavaScript中,原型对象只是在inheritance者之间共享的,它的属性也是共享的。 另一种方法是将原型的所有属性复制到新对象。 每种方法在不同情况下都有其优势。 我更喜欢第二个,但它不是什么JavaScript的。

读完所有的答案后,这是结论

1)对象直接从其他对象inheritance的inheritance

2)不使用类

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

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

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

JavaScript是一种基于原型的编程语言 (可能是基于原型的脚本语言是更正确的定义)。 它采用克隆而不是inheritance。 基于原型的编程语言是一种面向对象的编程风格,它使用函数作为类的构造函数。 尽pipeJavascript有一个关键字类,但它没有类声明。 将JavaScript与其他OOP语言进行比较时,这种区别非常重要。