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

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


当前回答

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

In classical inheritance, the programmer writes a class, which defines an object. Multiple objects can be instantiated from the same class, so you have code in one place which describes several objects in your program. Classes can then be organized into a hierarchy, furthering code reuse. More general code is stored in a higher-level class, from which lower level classes inherit. This means that an object is sharing code with other objects of the same class, as well as with its parent classes.

In the prototypal inheritance form, objects inherit directly from other objects. All of the business about classes goes away. If you want an object, you just write an object. But code reuse is still a valuable thing, so objects are allowed to be linked together in a hierarchy. In javascript, every object has a secret link to the object which created it, forming a chain. When an object is asked for a property that it does not have, its parent object will be asked... continually up the chain until the property is found or until the root object is reached.

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

优势

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

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

其他回答

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

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

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

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

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

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

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

In classical inheritance, the programmer writes a class, which defines an object. Multiple objects can be instantiated from the same class, so you have code in one place which describes several objects in your program. Classes can then be organized into a hierarchy, furthering code reuse. More general code is stored in a higher-level class, from which lower level classes inherit. This means that an object is sharing code with other objects of the same class, as well as with its parent classes.

In the prototypal inheritance form, objects inherit directly from other objects. All of the business about classes goes away. If you want an object, you just write an object. But code reuse is still a valuable thing, so objects are allowed to be linked together in a hierarchy. In javascript, every object has a secret link to the object which created it, forming a chain. When an object is asked for a property that it does not have, its parent object will be asked... continually up the chain until the property is found or until the root object is reached.

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

优势

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

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

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