資源描述:
《javascript程序中實(shí)現(xiàn)繼承特性的方式總結(jié)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。
1、JavaScript程序中實(shí)現(xiàn)繼承特性的方式總結(jié)JavaScript是一門強(qiáng)行聲稱面向?qū)ο蟮恼Z言,而繼承是面向?qū)ο蟮囊淮笾饕匦?,這里我們根據(jù)阮一峰老師的文章來看一下JavaScript程序中實(shí)現(xiàn)繼承特性的方式總結(jié)概述JavaScript的所有對(duì)象,都有自己的繼承鏈。也就是說,每個(gè)對(duì)象都繼承另一個(gè)對(duì)象,該對(duì)象稱為“原型”(prototype)對(duì)象。只有null除外,它沒有自己的原型對(duì)象。原型對(duì)象的重要性在于,如果A對(duì)象是B對(duì)象的原型,那么B對(duì)象可以拿到A對(duì)象的所有屬性和方法。Object.getPrototypof方法用于獲取當(dāng)前對(duì)象的原型對(duì)象。varp=O
2、bject.getPrototypeOf(obj):上面代碼中,對(duì)象P就是對(duì)象obj的原型對(duì)象。Object,create方法用于生成一個(gè)新的對(duì)象,繼承指定對(duì)象。varobj=0bject.create(p);上面代碼中,新生成的obj對(duì)象的原型就是對(duì)象p。非標(biāo)準(zhǔn)的_口〖010_屬性(前后各兩個(gè)下劃線),可以改寫某個(gè)對(duì)象的原型對(duì)象。但是,應(yīng)該盡量少用這個(gè)屬性,而是用Object.getPrototypeofO和Object.setPrototypeOfO,進(jìn)行原型對(duì)象的讀寫操作。varobj={};varp={}:obj.__proto_=p;Object,
3、getPrototypeOf(obj)===p//true上面代碼通過_proto_屬性,將p對(duì)象設(shè)為obj對(duì)象的原型。下面是一個(gè)實(shí)際的例子。vara={x:1};varb={__proto_:a};b.x//l上面代碼中,b對(duì)象通過_proto_屬性,將自己的原型對(duì)象設(shè)為a對(duì)象,因此b對(duì)象可以拿到a對(duì)象的所有屬性和方法。b對(duì)象本身并沒有x屬性,但是JavaScript引擎通過__proto_屬性,找到它的原型對(duì)象a,然后讀取a的x屬性。new命令通過構(gòu)造函數(shù)新建實(shí)例對(duì)象,實(shí)質(zhì)就是將實(shí)例對(duì)象的原型綁定構(gòu)造函數(shù)的prototype屬性,然后在實(shí)例對(duì)象上執(zhí)行構(gòu)造
4、函數(shù)。varo=newFoo();//等同于varo=newObject();o._proto_=Foo.prototype:Foo.call(o);原型對(duì)象自己的_proto_屬性,也可以指向其他對(duì)象,從而一級(jí)一級(jí)地形成“原型鏈”(prototypechain)。vara={x:1};varb={_proto_:a};varc={_proto_:b};c.x//l需要注意的是,一級(jí)級(jí)向上,在原型鏈尋找某個(gè)屬性,對(duì)性能是有影響的。所尋找的屬性在越上層的原型對(duì)象,對(duì)性能的影響越大。如果尋找某個(gè)不存在的屬性,將會(huì)遍歷整個(gè)原型鏈。this的動(dòng)作指向不管this在哪
5、里定義,使用的時(shí)候,它總是指向當(dāng)前對(duì)象,而不是原型對(duì)象。varo={nbsp;a:2,nbsp;m:function(b){nbsp;returnthis.a+1:nbsp;}};varp=Object.create(o);p.a=12;p.m()//13上面代碼中,p對(duì)象的m方法來自它的原型對(duì)象o。這時(shí),m方法內(nèi)部的this對(duì)象,不指向0,而是指向p。構(gòu)造函數(shù)的繼承這個(gè)小節(jié)介紹,如何讓一個(gè)構(gòu)造函數(shù),繼承另一個(gè)構(gòu)造函數(shù)。假定有一個(gè)Shape構(gòu)造函數(shù)。functionShape(){nbsp;this.x=0;nbsp;this.y=0;Shape,proto
6、type.move=function(x,y){nbsp;this.x+=x;nbsp:this.y+=y;nbsp;console.info(’Shapemoveck’);};Rectangle構(gòu)造函數(shù)繼承Shape。functionRectangle(){nbsp;Shape.call(this)://調(diào)用父類構(gòu)造函數(shù)//另一種寫法functionRectangle(){nbsp;this.base=Shape;nbsp;this,base();}//子類繼承父類的方法Rectangle.prototype=0bject.create(Shape.pro
7、totype);Rectangle,prototype,constructor=Rectangle;varrect=newRectangle():rectinstanceofRectangle//truerectinstanceofShape//truerect.move(1,1)//’Shapemoved.’上面代碼表示,構(gòu)造函數(shù)的繼承分成兩部分,一部分是子類調(diào)用父類的構(gòu)造方法,另一部分是子類的原型指向父類的原型。上面代碼中,子類是整體繼承父類。有時(shí),只需要單個(gè)方法的繼承,這時(shí)可以采用下面的寫法。ClassB.prototype.print=functio
8、n(){nbsp;ClassA.prototype.