JavaScript使用prototype屬性實現(xiàn)繼承操作示例
本文實例講述了JavaScript使用prototype屬性實現(xiàn)繼承操作。分享給大家供大家參考,具體如下:
JS并沒有顯式的繼承語法,在JS中所有的對象都是Object的子類實現(xiàn), 因而對象之間是平等關(guān)系.
盡管如此我們可以通過特殊的方法達到繼承的效果.
當(dāng)然JS也不能直接定義類, 我們通過定義函數(shù)可以得到一個同名的類 , 同時這個函數(shù)就是這個類的構(gòu)造器,
在定義函數(shù)時以this修飾的變量就是定義的 類的實例中的屬性,當(dāng)這個屬性時函數(shù)時, 就可以認為這個屬性變成了一個實例方法
//定義一個Person類function Person(name , age){ this.name=name; this.age=age; //定義一個info函數(shù) this.info=function() { document.writeln('年齡'+this.age+'姓名'+this.name); }}//創(chuàng)建Person類的實例對象var p1= new Person(’xiaoming’,20);//調(diào)用p1的info方法p1.info();var p2= new Person(’wang’,22);p2.info();
這種在類內(nèi)(函數(shù)內(nèi))定義函數(shù)的方式是有弊端的:
性能低下, 這種方式定義函數(shù)在每次創(chuàng)建對象時都會創(chuàng)建一個新的info函數(shù), 有多個對象就會有多個info函數(shù),實際上我們只需要一個info函數(shù), 這樣就會造成系統(tǒng)內(nèi)存泄漏, 引起性能的下降 使info函數(shù)中的局部變量產(chǎn)生閉包, 閉包會擴大局部變量的作用域,使局部變量存活到函數(shù)外為了避免這兩種情況, 通常不建議在類定義時為類定義方法,而是采用prototype屬性:
JS中所有類(函數(shù))都有一個prototype屬性, 為該屬性增加屬性方法可以視為對類的拓展,
也就是增加了prototype屬性的類繼承了原有的類 , 這也就是JS所提供的偽繼承機制
//定義一個Person類function Person(name , age){ this.name=name; this.age=age; //定義一個info函數(shù) this.info=function() { document.writeln('年齡'+this.age+'姓名'+this.name); }}//創(chuàng)建Person類的實例對象var p1= new Person(’xiaoming’,20);//調(diào)用p1的info方法p1.info(); //為Person類增加walk方法Person.prototype.walk=function(){ document.writeln(this.name+’正在走<br/>’);}var p2=new Person(’xiaohong’,20);//p2可以調(diào)用Person中的方法p2.info();//也可以調(diào)用prototype屬性增加的方法p2.walk();//JS允許為類動態(tài)增加方法和屬性,這里p1也可以調(diào)用walkp1.walk();
上例為prototype屬性增加了方法可以認為是為Person類動態(tài)地增加了方法,
這種方式增加的方法會讓所有實例共享一個walk方法, 可以注意到是Person.prototype類的屬性,并非實例
walk方法不在Person函數(shù)內(nèi),因此不會產(chǎn)生閉包,
這種為類動態(tài)地增加屬性和方法可以被當(dāng)作一種偽繼承,
但這種偽繼承并非產(chǎn)生 了新的子類而是修改了原有的類
別著急,prototype屬性還有另一種方式實現(xiàn)繼承:
prototype屬性代表該類原型對象, 即默認是一個Object對象, 將類prototype設(shè)為父類實例可以實現(xiàn)繼承
function Person(name,age){ this.name=name; this.age=age;}Person.prototype.say=function(){ console.log(this.name+’說話了’);}var per = new Person(’小明’,20);per.say();//再定義一個student類,欲意繼承Personfunction Student (grade){ this.grade=grade;}//將student的prototype設(shè)為Person對象Student.prototype =new Person(’小紅’,22);//為Student添加方法Student.prototype.intro= function(){ console.log(this.name+’是’+this.grade+’年級學(xué)生’);}var stu=new Student(3);stu.name='小剛';console.log(stu instanceof Person&& stu instanceof Student);//truestu.say();//小剛說話了stu.intro();//小剛是3年級學(xué)生
上例定義了Person類,增加了say()方法
又定義了Student類, 并將Student類的prototype屬性設(shè)為Person對象, 表明Student原型是Person對象,
也就是Student繼承了Person, 會得到其方法和屬性
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運算用法總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計有所幫助。
相關(guān)文章:
1. Jsp中request的3個基礎(chǔ)實踐2. 如何在jsp界面中插入圖片3. 解析原生JS getComputedStyle4. 淺談SpringMVC jsp前臺獲取參數(shù)的方式 EL表達式5. CSS3實例分享之多重背景的實現(xiàn)(Multiple backgrounds)6. ASP 連接Access數(shù)據(jù)庫的登陸系統(tǒng)7. .NET使用YARP通過編碼方式配置域名轉(zhuǎn)發(fā)實現(xiàn)反向代理8. jsp EL表達式詳解9. PHP循環(huán)與分支知識點梳理10. PHP設(shè)計模式中工廠模式深入詳解
