JS實(shí)現(xiàn)繼承的幾種常用方式示例
本文實(shí)例講述了JS實(shí)現(xiàn)繼承的幾種常用方式。分享給大家供大家參考,具體如下:
1,原型鏈繼承
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>原型鏈繼承</title> </head> <body> <script> /** * 優(yōu)點(diǎn): * 實(shí)例是父類(lèi)的實(shí)例也是子類(lèi)的實(shí)例 * 父類(lèi)新增原型方法或者原型屬性 子類(lèi)都能訪問(wèn)到 * 簡(jiǎn)單 易于實(shí)現(xiàn) * 缺點(diǎn): * 無(wú)法實(shí)現(xiàn)多繼承 * 來(lái)自原型對(duì)象的引用屬性和實(shí)例是所有子類(lèi)共享的 * 創(chuàng)建子類(lèi)實(shí)例的時(shí)候,無(wú)法向父構(gòu)造函數(shù)傳參 * 可以在Cat構(gòu)造函數(shù)中,為Cat實(shí)例增加實(shí)例屬性。如果要新增原型屬性和方法,則必須放在new Animal()這樣的語(yǔ)句之后執(zhí)行。 * **/ function Animal(name) { this.name=name;//屬性 this.sleep=function () {//實(shí)例方法 console.log(this.name+'正在睡覺(jué)') } } //原型方法 Animal.prototype.eat=function (food) { console.log(this.name+'正在吃'+food) }; //原型鏈繼承---核心:將父類(lèi)的實(shí)例作為子類(lèi)的原型 function Cat() { } Cat.prototype=new Animal(); Cat.prototype.name='cat'; var cat=new Cat(); console.log(cat);//cat._proto_====>Animal 可以使用Animal里面的name屬性 sleep方法 // 也可以使用 cat._proto_._proto_的eat方法 即animal的原型方法 // cat._proto_._proto_._proto_ 是object console.log(cat.name); cat.eat('fish'); cat.sleep(); </script> </body> </html>
運(yùn)行結(jié)果:
2,構(gòu)造繼承
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>構(gòu)造繼承</title> </head> <body> <script> /** *構(gòu)造繼承 相當(dāng)于復(fù)制父類(lèi)的實(shí)例給子類(lèi) (沒(méi)有用到原型) * 只能使用父類(lèi)的屬性和方法 不能繼承原型屬性和方法 所以cat不能使用eat方法 * **/ function Animal(name) { this.name=name;//屬性 this.sleep=function () {//實(shí)例方法 console.log(this.name + '正在睡覺(jué)!'); } } // 原型方法 Animal.prototype.eat = function(food) { console.log(this.name + '正在吃:' + food); }; function Cat(name) { Animal.call(this,name);//Cat就可以使用Animal的 // this.name=name } var cat=new Cat('Tom'); console.log(cat);//只能使用Animal的屬性和實(shí)例方法 不能使用原型的方法 //cat的_proto_(指向的是一個(gè)函數(shù)) 是cat 構(gòu)造器是Cat cat的_proto_._proto_ 是object console.log(cat.name); // cat.eat('fish'); cat.sleep() </script> </body> </html>
運(yùn)行結(jié)果:
3,組合繼承
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>組合繼承</title> </head> <body> <script> function Animal(name) { this.name=name; this.sleep=function () { console.log(this.name+"正在睡覺(jué)"); }; } Animal.prototype.eat=function (food) { console.log(this.name+"正在吃"+food); } function Cat(name) { Animal.call(this,name) } Cat.prototype=new Animal(); // 組合繼承也是需要修復(fù)構(gòu)造函數(shù)指向的。 Cat.prototype.constructor=Cat;//構(gòu)造器進(jìn)行修改 Cat.prototype.show=function () {//可以在子類(lèi)的原型上加方法 不影響父類(lèi) console.log("11111") }; var cat=new Cat('Tom'); console.log(cat);//cat可以直接使用animal的屬性和實(shí)例方法 //cat.proto是Animal cat.proto_._proto_ 是eat cat.proto_._proto_._proto_是object console.log(cat.name); cat.sleep(); cat.eat('fish') cat.show() </script> </body> </html>
運(yùn)行結(jié)果:
4,寄生組合繼承
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>寄生組合繼承</title> </head> <body> <script> function Animal(name) { this.name=name; this.sleep=function () { console.log(this.name+"正在睡覺(jué)"); } } // 原型方法 Animal.prototype.eat = function(food) { console.log(this.name + '正在吃:' + food); }; function Cat(name) { Animal.call(this,name); } // (function () { //創(chuàng)建一個(gè)沒(méi)有實(shí)例方法的類(lèi) var Super=function () { }; Super.prototype=Animal.prototype;//eat console.log(Animal.prototype);//構(gòu)造方法還是Animal 可以使用eat方法 eat的_proto_ 是object //初始化這個(gè)實(shí)例 把它作為子類(lèi)(Cat)的原型 Cat.prototype=new Super();//一般 的話是new Animal() Cat.prototype.constructor=Cat;//Cat的構(gòu)造器還是Cat // })(); var cat=new Cat('Tom'); console.log(cat.name); cat.sleep(); cat.eat('food') </script> </body> </html>
運(yùn)行結(jié)果:
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測(cè)試上述代碼運(yùn)行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《javascript面向?qū)ο笕腴T(mén)教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
詳解javascript實(shí)現(xiàn)瀑布流列式布局
這篇文章主要介紹了javascript實(shí)現(xiàn)瀑布流的兩種布局方式,一是絕對(duì)式布局、二是列式布局,詳細(xì)介紹了這兩種布局方式的原理,本文重點(diǎn)介紹列式布局,感興趣的小伙伴們可以參考一下2016-01-01javascript字符串與數(shù)組轉(zhuǎn)換匯總
本文給大家分享的是Js中字符串轉(zhuǎn)換成數(shù)組,數(shù)組轉(zhuǎn)換成字符串的函數(shù),十分的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。2015-05-05Javascript 獲取字符串字節(jié)數(shù)的多種方法
Javascript 字符串字節(jié)數(shù)獲取功能多種方法2009-06-06使弱類(lèi)型的語(yǔ)言JavaScript變強(qiáng)勢(shì)
Javascript (ECMA Script)是一種弱類(lèi)型的語(yǔ)言.這并不意味著它沒(méi)有數(shù)據(jù)類(lèi)型,只是變量或者Javascript對(duì)象屬性不需要一個(gè)特定類(lèi)型的值分配給它或者它始終使用相同的值.Javascript中的變量同樣支持自由類(lèi)型轉(zhuǎn)換成為適用(或者要求)的內(nèi)容以便于使用.2009-06-06JScript中的"this"關(guān)鍵字使用方式補(bǔ)充材料
JScript中的"this"關(guān)鍵字使用方式補(bǔ)充材料...2007-03-03使用javaScript動(dòng)態(tài)加載Js文件和Css文件
這篇文章主要介紹了如何使用javaScript動(dòng)態(tài)加載Js文件和Css文件2015-10-10JS樹(shù)形菜單組件Bootstrap TreeView使用方法詳解
這篇文章主要為大家詳細(xì)介紹了js組件Bootstrap TreeView使用方法,本文一部分針對(duì)于bootstrap的treeview的實(shí)踐,另一部分是介紹自己寫(xiě)的樹(shù)形菜單,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12小程序?qū)崿F(xiàn)頁(yè)面跳轉(zhuǎn)與數(shù)據(jù)傳遞方案
在開(kāi)發(fā)過(guò)程中經(jīng)常會(huì)遇到在微信小程序的頁(yè)面跳轉(zhuǎn)以及數(shù)據(jù)傳遞的知識(shí)點(diǎn),所以下面這篇文章主要給大家介紹了關(guān)于小程序?qū)崿F(xiàn)頁(yè)面跳轉(zhuǎn)與數(shù)據(jù)傳遞的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09