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

时间:2008-10-09 07:22:58

标签: javascript oop inheritance prototype-programming

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

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

7 个答案:

答案 0 :(得分:272)

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

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

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

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

<强>优点

为什么原型继承是代码重用的有利形式,可能没有一个硬性规则。代码重用本身是有利的,原型继承是一种合理的方式来实现它。您可能会认为原型继承是代码重用的一个相当简单模型,并且该代码可以在直接方式中大量重用。但是古典语言肯定能够实现这一目标。

旁注: @Andrew Hedges 提出了一个很好的观点,即实际上有many个原型语言。值得注意的是,其他这些存在,但也值得注意的是,它们都没有接近主流。 NewtonScript似乎有一段时间的牵引力,但死于其​​平台。也可以通过增加原型功能的方式扩展一些现代语言。

答案 1 :(得分:49)

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

答案 2 :(得分:31)

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

答案 3 :(得分:10)

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

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

答案 4 :(得分:5)

您可以创建相同类型的对象,而不是声明类结构,并且只要您喜欢使用对象的原型,就可以添加到它们的定义中。 它比正常的做事方式更灵活。

答案 5 :(得分:5)

如果您只是在运行时使用对象而不是在编译时使用类来构建新对象,则可以在不知道任何有关它的细节的情况下扩展对象。当然,根据使用情况,它可能会很快变得不利。我没有对这里的语言做任何假设,因此它适用于除了javascript以外的语言,它们不是动态的。

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

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

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

答案 6 :(得分:4)

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

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

2)不使用类

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

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

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