左耳听风_037_36_编程范式游记7-_基于原型的编程范式
你好,我是陈浩网名猪耳朵house.那今天这节课呢我们来讲基于圆形的编程范式。
那基于圆形phototype的编程呢啊其实也是面向对象编程的一种方式,它没有class化啊直接使用对象,所以呢又叫基于实例的编程。
那使用这个辩程范式的主流语言呢是javascript.那与传统的面向对象编程相比呢,基于原形编程有这么几点不同。
那首先呢在基于类的编程当中呢,对象总共有两种类型类呢定义了对象的基本布局和函数特性。
而接口呢是可以使用的对象啊,它基于特定类的样式。
那在这个模型中呢,类表现为行为和结构的集合。
那对所有的接构来说呢,这些类的行为和结构啊都是相同的。
所以区分规则啊首先是基于行为和结构,然后呢才是状态。
而圆形编程的支持者呢经常争论说啊基于类的语言,它提倡使用一个关注类和类之间关系的开发模型。
那相比来说呢,圆形编程看起来更提倡程序员关注一系列对象实例的行为。
到后面呢才会去关心怎么把这些对象划分到最近的使用方式,相似的原型对象啊,而不是分成类。
所以呢很多基于圆形的系统啊,他提倡在运行时进行圆形的修改。
而只有极少数基于类的面向对象系统啊,允许类在程序运行时被修改。
那另外呢在基于类的语言中啊,一个新的实例是通过类构造器和构造器可选的参数来构造的那构造出来的实例呢它的行为和布局是由这个类来选定的。
而在基于圆形的系统中,构造对象呢有两种方法,我们可以复制已有的对象,也可以通过扩展一个空对象来创建。
那很多基于圆形的系统呢都支持在运行时进行圆形的修改。
而基于类的面向对象系统呢,只有动态语言允许类在运行时被修改。
那这里呢我们以javascript为例子啊,详细介绍一下原型的概念。
那一般来说呢,面向对象里面啊要有个class,但是javascript觉得不是这样的啊,它就是要基于原形编程啊,就不要class,就直接啊在对象上改就行了。
啊,基于原型的修改,直接对类型进行修改。
我们先来看一个例子,我声明了两个javascript对象,一个呢是父,一个是bar,它们分别有不同的属性。
在javascript中呢,每个对象都有一个隐含的downer photo的属性。
那这个呢就是圆形。
那对于刚刚这两个对象呢,如果我们把赋赋制给bar点downer photo,那就意味着bar的原型呢就成了负的。
于是呢我们就可以在ar里面访问赋的属性了。
那这里呢我需要解释一下java trip,这两个东西一个呢是downer photo,另一个呢是photo type.那这两个东西呢很容易混淆。
我在这里呢说明一下,downer portto呢主要是安放在一个实际的对象中啊,它用来产生一个链接,一个圆形链,用来寻找方法名啊或者属性等等。
而photo type呢是用new来创建一个对象的时候,构造downer plottle用的,它是构造函数的一个属性。
在javascript t中呢对象有两种表现形式,一种呢是object,一种呢是function.我们可以简单的认为啊,downdoor proto呢是所有对象用来链接圆形的一个指针。
而ptoto type呢则是function对象的属性。
那它主要的作用呢是当利用一个对象的时候,要让downdoor proto指针啊指向这个ptoto type.那对于超级对象function对象来说呢,它的downptoto属性呢就是prototype自己。
那文中呢有一段代码,我创建了三个对象ABC,然后呢我把b和c的downer portal属性啊都指向了a那这样b和c啊就都可以调用到a对象中声明的成员变量和方法了。
那这三个对象的圆形链呢,我在图中表示了出来,然后呢我们再写一段代码。
这次呢我不直接修改b和c的downd属性,而是声明了一个构造函数负。
然后呢我在负的protoprototype属性中啊加入成员变量和方法。
那这样我用负构造出来的b和c啊,同样可以访问到这个成员变量和方法。
那这段代码的内存布局呢,我在图中展示了出来。
这个图啊应该可以让你很好的看明白doana photo和phototype的差别了。
我们再写一段代码来测试一下啊,你会发现b和c的downloptoal属性,constructor属性。
对对的,方方地址啊确实和图中的内存布局啊一样。
那这点呢我需要说明一下,负点phototype自动创建了一个属性constructor.那这个呢是一个指向函数自己的一个reference.那这样一来呢,对于实例b或者c来说啊,就都能访问到这个继承的constructor了。
那有了这些基本概念呢啊,我们就可以讲一下javascript的面向对象编程了。
我们呢先来写一段代码,来重温一下上面讲述的内容。
在这段代码中呢,我们先生成了一个corner函数对象person.然后我让这个corner函数对象new出另一个对象啊,存在变量p中。
那这个时候呢我再改变person叫trolel type啊,让它有一个name属性和一个say hello的方法。
那这个时候呢我们发现刚刚创建出来的p中的对象也跟着一起改变了。
那这里呢我们需要注意,当创建person函数的时候呢,person点donald pproto啊指向了function点ptoto type.当我执行YP等于new person的时候呢,p的downdoor photo指向了person,点pptole type.所以呢当我修改了person ent pprototype的内容之后呢,p点dolt pproto的内容也就跟着改变了。
好了,我们再来看一下在圆形编程中面向对象的编程玩法。
首先呢我们定义一个person类,在这个对象中呢包含属性full name和email啊,以及speak和introduction方法啊,其实呢所谓的方法也是属性,然后呢我们可以定义一个student对象。
那在这里呢我使用了person点call,那call或者apply啊,都是为了动态改变this所指向的对象的内容而出现的那这里的this呢就是student,我们还承载了introduction方法,并且呢新增加了一个take exams方法啊,虽然啊我们这样定义了student,但是它还没有和person发生继承关系。
那为了要让他们发生关系呢,我们就需要修改student原型啊,我们可以简单粗暴的做赋值,让student dodownor啊等于portperson点porttotype.但是呢这个太粗暴了,我们还是来使用比较规范的方式。
先用opject点create来,将person点purtotype和student点protototype关联上。
然后呢,我修改一下构造函数,让student点phototype,将constructor啊等于student.那这样呢我们就可以创建一个student的实例,然后调用它继承的person对象中的方法了。
那以上这些呢就是基于圆形的面向对象变成的玩法了。
好了,这节课到这里呢就结束了。
我们来简单总结一下,我们可以看到前面这种玩法呢就是一种委托的方式。
在使用委托的基于原形的语言中呢,运行时域啊,可以仅仅通过序列的指针找到匹配这样的方式来定位属性啊,或者寻找正确的数据。
那所有这些创建行为共享的行为,都需要委托指针和基于类的面向对象语言。
中类和接口的关系不同。
原型呢和它分支之间的关系啊,并不要求子对象有相似的内存结构。
所以呢子对象它可以继续修改,而无需像基于类的系统那样整理结构。
另外还有一点,不仅仅是数据能被修改,方法呢也能被修改。
所以大多数基原型的语言啊都会把数据和方法叫做slot.那这种在对象里面直接修改的玩法啊,虽然可以带来运行时的灵活性啊,我们可以在运行时修改一个protototype,它增加甚至删除属性性的方法。
但是呢它带来了执行的不确定性啊,也有安全性的问题,而代码呢还变得不可预测。
而代码呢有点黑科技的味道,它不像静态类型系统,它没有一个不可变的契约,对代码的确定性做保证。
所以呢使用者需要自己来保证代码的确定性。
那文文呢呢是编程范式游戏列列文章的目录,方便你了解这一系列内容的全貌。