据说 Javascript 的主要优点之一是它是一种基于原型的语言。
但是 Javascript 基于原型意味着什么,为什么这是一个优势?
据说 Javascript 的主要优点之一是它是一种基于原型的语言。
但是 Javascript 基于原型意味着什么,为什么这是一个优势?
原型继承是面向对象代码重用的一种形式。Javascript 是唯一使用原型继承的 [主流] 面向对象语言之一。几乎所有其他面向对象的语言都是经典的。
在经典继承中,程序员编写一个定义对象的类。多个对象可以从同一个类中实例化,因此您可以在一个地方拥有描述程序中多个对象的代码。然后可以将类组织成层次结构,从而促进代码重用。更通用的代码存储在较高级别的类中,较低级别的类从该类继承。这意味着一个对象与同一类的其他对象以及它的父类共享代码。
在原型继承形式中,对象直接从其他对象继承。所有关于课程的事情都消失了。如果你想要一个对象,你只需写一个对象。但是代码重用仍然是一件有价值的事情,因此允许对象在层次结构中链接在一起。在 javascript 中,每个对象都有一个指向创建它的对象的秘密链接,形成一个链。当一个对象被询问一个它没有的属性时,它的父对象将被询问......不断地向上链直到找到该属性或直到到达根对象。
JavaScript 中的每个函数(它们本身就是对象)实际上都有一个名为“原型”的成员,它负责在对象被请求时提供值。拥有这个成员允许构造器机制(通过它从函数构造对象)工作。将属性添加到函数对象的原型将使其可用于构造的对象,以及从它继承的所有对象。
好处
关于为什么原型继承是代码重用的一种有利形式,可能没有硬性规定。代码重用本身是有利的,原型继承是一种明智的做法。您可能会争辩说,原型继承是一种相当简单的代码重用模型,并且可以以直接的方式大量重用代码。但古典语言当然也能做到这一点。
旁注: @Andrew Hedges提出了一个很好的观点,实际上有很多原型语言。值得注意的是,这些其他的存在,但也值得注意的是,它们都不是接近主流的东西。NewtonScript 似乎有一段时间的吸引力,但随着它的平台而死。还可以通过添加原型功能的方式扩展一些现代语言。
基于原型的语言不区分类与对象:它只是具有对象。基于原型的语言具有原型对象的概念,该对象用作模板,从中获取新对象的初始属性。任何对象都可以在您创建它时或在运行时指定它自己的属性。此外,任何对象都可以作为另一个对象的原型关联,从而允许第二个对象共享第一个对象的属性。
基于原型的编程是一种面向对象的编程风格,其中不存在类,行为重用(或基于类的语言中的继承)是通过克隆用作原型的现有对象来执行的。
优点/缺点是,我们可以在运行时创建新类型的对象,而无需定义类(静态代码)。像大多数功能一样,开发人员可以将其转化为优势/劣势。
以上是可能的,因为对象本质上是 java 脚本中的函数(也是闭包)。
看完所有答案,这就是结论
1) 对象直接从其他对象继承的继承
2)不使用类
3) 也称为基于实例的编程或面向无类原型的编程
4)通过克隆作为原型的现有对象来执行行为重用
5) 从新对象中用作模板的对象获取初始属性
无需声明类结构,您可以创建相同类型的对象,并在您喜欢使用对象的原型的任何时候添加到它们的定义中。它比正常的做事方式更灵活。
如果您只是在运行时使用对象而不是在编译时使用类来构建新对象,这将打开扩展对象而不知道任何细节的可能性。当然,根据使用情况,它可能很快就会成为劣势。我对这里的语言不做任何假设,因此它适用于除 javascript 之外的非动态语言。
myobject.prototype=unkownobject;
myobject.newproperty=1;
您几乎可以从任何地方获取该对象;你自己的代码,来自网络,来自数据库,来自外部链接等等。
请注意,语言不必像 javascript 那样实现原型继承。在 javascript 中,原型对象只是在继承者之间共享,它的属性也是如此。另一种方法是将原型的所有属性复制到新对象。每种方法在不同情况下都有其优势。我更喜欢第二个,但这不是 javascript 所做的。
节省内存是 JS 中原型继承的好处之一。在像 Java 这样的语言中,对象生成它们自己的超类实例变量和方法的副本,而在 JS 中,“超级”对象提供对其变量和方法的获取访问权限,以访问从它继承的每个“子”对象无需重新创建它们。