资源描述:
《javascript中的原型继承基础学习教程_基础知识》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、JavaScript中的原型继承基础学习教程大多数编程语言中,都有类和对象,一个类可以继承其他类。在JavaScript中,继承是基于原型的(prototype-based),这意味着JavaScript中没有类,取而代之的是一个对象继承另一个对象。:)1.继承,theproto在JavaScript中,当一个对彖rabbit继承另一了对彖animal时,这意味着rabbit对彖中将会有一个特殊的属性:rabbit._proto_=animal;当访问rabbit对象吋,如果解释器在rabbit中不能找到属性,那么它会顺着_proto—链往上在animal对象中寻找栗了中的
2、—proto—屈性仅在Chrome和FircFox中可以访问,请看一个栗了:varanimal={eats:true}varrabbit二{jumps:true}rabbit._proto_=animal//inheritalert(rabbit.eats)//trueeats属性是从animal对象中访问的。如果在rabbit对彖屮已经发现了属性,那么就不会去检查proto属性啦。再来一个栗子,当子类中也有eats属性时,父类中的就不会访问了。varanimal二{eats:true}varfedUpRabbit二{eats:false}fedUpRabbit._prot
3、o_=animalalert(fedUpRabbit.eats)//false你也可以在animal中添加一个函数,那么在rabbit中也可以访问了。varanimal二{eat:function(){alert(〃I'mfull")this・full二true}}varrabbit二{jump:function(){/*something*/}rabbit・_proto_=animal(1)rabbit,eat():rabbit,eat()函数以如下两步执行:首先,解释器查找rabbit,cat,rabbitH1没有cat函数,那么它就顺着rabbit._proto—往上
4、找,在animal中找到了。函数以this=rabbit运行。this值与_proto_属性完全无关。因此,this,ful1=true在rabbit中:看看这里我们有什么新发现,一个对象调用了父类函数,但是this还是指向对彖本身,这就是继承。被—proto—引用的对象称作是原型(prototype),animal是rabbit的原型(译者注:这就是rabbit的_proto_属性引用了animal的prototype属性)(2)读时查找,不是写时当读取一个对象时,比如this,prop,解释器会在它的原型中查找属性。当设置一个屈性值时,比如this,prop=value
5、,那么就没有理由去查找了,这个属性(prop)会被直接添加到这个对象中(这里是this)odeleteobj.prop也类似,它只删除对象木身的属性,原型中的属性保持原封不动。(3)关T*proto如果你在阅读指南,这里我们叫的—roto—,在指南中表示为[[Prototype]]o双方括号是很重要的,因为有另一个屈性叫做prototypeo1.Object・create,Object・getPrototypeOf—proto_是一个非标准的属性,由Chrome/FireFox提供访问,在其他的浏览器中保持不可见。所冇的现代浏览器除了Opera(TE>9)支持两个标准的函数
6、來处理原型问题:Object.ceate(prop[,props])用给定了proto创建一个空对象:varanimal二{eats:true}rabbit=Object・create(animal)alert(rabbit,eats)//true上而代码创建了一个空rabbit对象,并月.原型设置为animalrabbit对彖创建好以后,我们可以往里添加属性了:varanimal={eats:true}rabbit=Objcct・create(animal)rabbit,jumps=trueObject,creat函数的第二个参数props是口J选的,它允许像新对象设置属
7、性。这里就省略了,因为我们关系的继承。(1)Object.gctPrototypcOf(obj)返回obj.—proto—的值。这个函数是标准的,可以在不能直接访问—proto—属性的浏览器中使用了。varanimal二{eats:true}rabbit二Object,create(animal)alert(Object,gctPrototypeOf(rabbit)二二二emimal)//true现代浏览器允许读取_proto_M性值,但是不能设置。1.Theprototype有一些好的跨浏览器的方式设置_prot