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

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


当前回答

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

其他回答

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

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

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

2)不使用类

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

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

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

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

原型继承是面向对象代码重用的一种形式。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似乎有一些吸引力,但随着它的平台而消亡。还可以通过添加原型功能的方式扩展一些现代语言。

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

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