课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
原型在编程开发中还是使用比较多的一个模型的,而今天我们就一起来了解一下,在JavaScript编程环境下,关于原型我们都需要了解哪些知识。
什么是原型?
原型是顺应人类自然思维的产物。中文中有个成语叫做“照猫画虎”,这里的猫看起来就是虎的原型,所以由此,我们可以看出,用原型来描述对象的方法可以说是古已有之。
成功的流派是使用“类”的方式来描述对象,这诞生了诸如C++、Java等流行的编程语言。这个流派叫做基于类的编程语言。
还有一种则就是基于原型的编程语言,它们利用原型来描述对象。我们的JavaScript就是其中代表。
“基于类”的编程提倡使用一个关注分类和类之间关系开发模型。在这类语言中,总是先有类,再从类去实例化一个对象。类与类之间又可能会形成继承、组合等关系。类又往往与语言的类型系统整合,形成一定的编译时能力。
与此相对,“基于原型”的编程看起来更为提倡程序员去关注一系列对象实例的行为,而后才去关心如何将这些对象,划分到近的使用方式相似的原型对象,而不是将它们分成类。基于原型的面向对象系统通过“复制”的方式来创建新对象。一些语言的实现中,还允许复制一个空对象。这实际上就是创建一个全新的对象。
基于原型和基于类都能够满足基本的复用和抽象需求,但是适用的场景不太相同。
这就像专业人士可能喜欢在看到老虎的时候,喜欢用猫科豹属豹亚种来描述它,但是对一些不那么正式的场合,“大猫”可能更为接近直观的感受一些。(插播一个冷知识:比起老虎来,美洲狮在历史上相当长时间都被划分为猫科猫属,所以性格也跟猫更相似,比较亲人)
我们的JavaScript并非一个使用原型的语言,在它之前,self、kevo等语言已经开始使用原型来描述对象了,事实上,Brendan更是曾透露过,他初的构想是一个拥有基于原型的面向对象能力的scheme语言(但是函数式的部分是另外的故事,这篇文章里,我暂时不做详细讲述)。
在JavaScript之前,原型系统就更多与高动态性语言配合,并且多数基于原型的语言提倡运行时的原型修改,我想,这应该是Brendan选择原型系统很重要的理由。
原型系统的复制操作,有两种实现思路,一个是并不真的去复制一个原型对象,而是使得新对象持有一个原型的引用,另一个是切实地复制对象,从此两个对象再无关联。历史上的基于原型语言因此产生了两个流派,显然,JavaScript显然选择了前一种方式。
JavaScript的原型
如果我们抛开JavaScript用于模拟Java类的复杂语法设施(如new、FunctionObject、函数的prototype属性等),原型系统可以说相当简单,我可以用两条概括:
如果所有对象都有私有字段[[prototype]],就是对象的原型;
读一个属性,如果对象本身没有,则会继续访问对象的原型,直到原型为空或者找到为止。
这个模型在ES的各个历史版本中并没有很大改变,但从ES6以来,JavaScript提供了一系列内置函数,以便更为直接地访问操纵原型。三个方法分别为:
Object.create根据指定的原型创建新对象,原型可以是null;
Object.getPrototypeOf获得一个对象的原型;
Object.setPrototypeOf设置一个对象的原型。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。