Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript是一种基于原型的语言,这意味着什么?_Javascript_Oop_Inheritance_Prototype Programming - Fatal编程技术网

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

Javascript是一种基于原型的语言,这意味着什么?,javascript,oop,inheritance,prototype-programming,Javascript,Oop,Inheritance,Prototype Programming,据说Javascript的主要优势之一是它是一种基于原型的语言 但是Javascript是基于原型的,这意味着什么?为什么这是一个优势?您可以创建相同类型的对象,并在任何时候使用对象的原型添加到它们的定义中,而不是声明类结构。 它比正常的处理方式更灵活。一种基于原型的语言,不区分类和对象:它只是有对象。基于原型的语言具有原型对象的概念,该对象用作模板,从中获取新对象的初始属性。任何对象都可以在创建时或在运行时指定自己的属性。此外,任何对象都可以关联为另一个对象的原型,允许第二个对象共享第一个对象

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


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

您可以创建相同类型的对象,并在任何时候使用对象的原型添加到它们的定义中,而不是声明类结构。
它比正常的处理方式更灵活。

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

基于原型的编程是一种面向对象编程风格,其中不存在类,行为重用(或基于类的语言中的继承)通过克隆用作原型的现有对象来执行。原型继承是一种面向对象的代码重用形式。Javascript是唯一使用原型继承的[主流]面向对象语言之一。几乎所有其他面向对象的语言都是经典的

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

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

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

优势

关于为什么原型继承是代码重用的一种有利形式,可能没有一条硬性规定。代码重用本身是有利的,而原型继承是一种明智的方法。您可能会认为原型继承是一个相当简单的代码重用模型,代码可以通过直接的方式大量重用。但古典语言当然也能做到这一点


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

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


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

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

myobject.prototype=unkownobject;
myobject.newproperty=1;
你可以从任何地方得到物体;你自己的代码,来自网络,来自数据库,来自外部链接等等


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

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

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

2) 它不使用类

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

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


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

这是一个很好的解释,但关于“初始属性模板”的注释有点误导。如果你在实例化一个对象后改变了原型,这个对象仍然会收到那些函数。虽然JavaScript是目前最流行的原型语言,但还有很多其他语言:嘿,安德鲁。黏液