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

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

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

63147 次浏览
与声明类结构不同,您可以创建相同类型的对象,并在任何您喜欢使用对象原型的时候添加到它们的定义。 它比正常的做事方式更灵活。

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

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

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

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

原型继承形式中,对象直接继承来自其他对象。所有关于课程的事情都消失了。如果你想要一个对象,你只需要写一个对象。但是代码重用仍然是一件有价值的事情,所以对象被允许在层次结构中链接在一起。在javascript中,每个对象都有一个秘密链接到创建它的对象,形成一个链。当一个对象被请求一个它没有的属性时,它的父对象将被请求…继续沿着链向上,直到找到属性或到达根对象。

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

优势

关于为什么原型继承是一种有利的代码重用形式,可能没有一个严格的规则。代码重用本身是有利的,原型继承是一种明智的方法。你可能会认为原型继承是相当简单的模型的代码重用,并且代码可以在直接的方式中大量重用。但古典语言当然也能做到这一点。

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

优点/缺点是,我们可以在运行时创建新的对象类型,而不需要定义类(静态代码)。与大多数功能一样,这取决于开发者如何将其转化为优势或劣势。

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

如果您只是在运行时使用对象而不是在编译时使用类来构建新对象,那么就有可能在不了解对象的任何细节的情况下扩展对象。当然,根据使用情况,它可能很快成为一个缺点。我在这里没有对语言做任何假设,所以它适用于javascript以外的非动态语言。

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

你可以从任何地方得到这个物体;您自己的代码,来自网络,来自数据库,来自外部链接等等。

注意,语言不需要像javascript那样实现原型继承。在javascript中,原型对象只是在继承者之间共享,它的属性也是如此。另一种方法是将原型的所有属性复制到新对象中。每种方法在不同的情况下都有其优点。我更喜欢第二种,但这不是javascript所做的。

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

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

2)不使用类

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

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

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

内存保存是JS中原型继承的好处之一。在像Java这样的语言中,对象会生成父类的实例变量和方法的自己的副本,而在JS中,“超”对象提供了对继承自它的每个“子”对象的变量和方法的访问,而不需要重新创建它们。