日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

js中實現繼承的五種方法

瀏覽:167日期:2024-04-06 17:27:22
借用構造函數

這種技術的基本思想很簡單,就是在子類型構造函數的內部調用超類型的構造函數。另外,函數只不過是在特定環境中執行代碼的對象,因此通過使用apply()和call()方法也可以在新創建的對象上執行構造函數。

function Box(name){ this.name = name}Box.prototype.age = 18function Desk(name){ Box.call(this, name) // 對象冒充,對象冒充只能繼承構造里的信息}var desk = new Desk(’ccc’)console.log(desk.name) // --> cccconsole.log(desk.age) // --> undefined

從中可以看到,繼承來的只有實例屬性,而原型上的屬性是訪問不到的。這種模式解決了兩個問題,就是可以傳參,可以繼承,但是沒有原型,就沒有辦法復用。

組合繼承

function Box(name){ this.name = name}Box.prototype.run = function (){ console.log(this.name + ’正在運行...’)}function Desk(name){ Box.call(this, name) // 對象冒充}Desk.prototype = new Box() // 原型鏈var desk = new Desk(’ccc’)console.log(desk.name) // --> cccdesk.run() // --> ccc正在運行...

這種繼承方式的思路是:用使用原型鏈的方式來實現對原型屬性和方法的繼承,而通過借用構造函數來實現對實例屬性的繼承。

原型式繼承

原型式繼承:是借助原型可以基于已有的對象創建新對象,同時還不必因此創建自定義類型。講到這里必須得提到一個人,道格拉斯·克羅克福德在2006年寫的一篇文章《Prototype inheritance in Javascript》(Javascript中的原型式繼承)中給出了一個方法:

function object(o) { //傳遞一個字面量函數 function F(){} //創建一個構造函數 F.prototype = o; //把字面量函數賦值給構造函數的原型 return new F() //最終返回出實例化的構造函數}

看如下的例子:

function obj(o) { function F (){} F.prototype = o; return new F()}var box = { name: ’ccc’, age: 18, family: [’哥哥’,’姐姐’]}var box1 = obj(box)console.log(box1.name) // --> cccbox1.family.push(’妹妹’)console.log(box1.family) // --> ['哥哥', '姐姐', '妹妹']var box2 = obj(box)console.log(box2.family) // --> ['哥哥', '姐姐', '妹妹']

因為上述的代碼的實現邏輯跟原型鏈繼承很類似,所以里面的引用數組,即family屬性被共享了。

寄生式繼承

function obj(o) { function F (){} F.prototype = o; return new F()}function create(o){ var clone = obj(o) // 通過調用函數創建一個新對象 clone.sayName = function(){ // 以某種方式來增強這個對象 console.log(’hi’) } return clone // 返回這個對象}var person = { name: ’ccc’, friends: [’aa’,’bb’]}var anotherPerson = create(person)anotherPerson.sayName() // --> hi

這個例子中的代碼基于person返回一個新對象————anotherPerson。新對象不僅具有person的所有屬性和方法,而且還有自己的sayHi()方法。在主要考慮對象而不是自定義類型和構造函數的情況下,寄生式繼承也是一種有用的模式。使用寄生式繼承來為對象添加函數,會由于不能做到函數復用而降低效率,這一點與構造函數模式類似。

寄生組合式繼承

前面說過,組合繼承是Javascript最常用的繼承模式,不過,它也有自己的不足。組合繼承最大的問題就是無論什么情況下,都會調用過兩次超類型構造函數:一次是在創建子類型原型的時候,另一次是在子類型構造函數內部。沒錯,子類型最終會包含超類型對象的全部實例屬性,但我們不得不在調用子類型構造函數時重寫這些屬性,再來看一下下面的例子:

function SuperType(name){ this.name = name; this.colors = [’red’,’black’]}SuperType.prototype.sayName = function (){ console.log(this.name)}function SubType(name, age){ SuperType.call(this, name) // 第二次調用SuperType this.age = age}SubType.prototype = new SuperType() // 第一次調用SuperTypeSubType.prototype.constructor = SubTypeSubType.prototype.sayAge = function (){ console.log(this.age)}

第一次調用SuperType構造函數時,SubType.prototype會得到兩個屬性:name和colors。他們都是SuperType的實例屬性,只不過現在位于SubType的原型中。當調用SubType構造函數時,又會調用一次SuperType構造函數,這個一次又在新對象上創建了實例屬性name和colors。于是,這兩個屬性就屏蔽了原型中的兩個同名屬性。即有兩組name和colors屬性:一組在實例上,一組在原型上。這就是調用兩次SuperType構造函數的結果。解決這個問題的方法就是————寄生組合式繼承。所謂寄生組合式繼承,即通過借用構造函數來繼承屬性,通過原型鏈的混成形式來繼承方法。其背后的基本思路是:不必為了制定子類型的原型而調用超類型的構造函數,我們所需要的無非就是超類型原型的一個副本而已。本質上,就是使用寄生式繼承來繼承超類型的原型,然后再將結果指定給子類型的原型。寄生組合式繼承的基本模式如下:

function object(o) { function F (){} F.prototype = o; return new F()}function inheritPtototype(subType, superType){ var prototype = object(superType.prototype) // 創建對象 prototype.constructor = subType // 增強對象 subType.prototype = prototype// 指定對象}function SuperType(name){ this.name = name this.colors = [’red’, ’white’]}SuperType.prototype.sayName = function(){ console.log(this.name)}function SubType(name,age){ SuperType.call(this,name) this.age = age}inheritPtototype(SubType, SuperType)SubType.prototype.sayAge = function(){ console.log(this.age)}var instance = new SubType(’ccc’, 18)instance.sayName() // --> cccinstance.sayAge() // --> 18console.log(instance)

控制臺打印出的結構:

js中實現繼承的五種方法

詳細的圖解:

js中實現繼承的五種方法

這個例子的高效率提現在它值調用了一次SuperType構造函數,并且因此避免了在SubType.prototype上面創建不必要的、多余的屬性。與此同時,原型鏈還能保持不變;因此,還能夠正常使用instanceof和isPrototypeOf()。這也是很多大廠用的繼承方式。

以上就是js中實現繼承的五種方法的詳細內容,更多關于js 實現繼承的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品美女| 国产精品久av福利在线观看| 卡一精品卡二卡三网站乱码| 蜜桃av一区二区三区电影| 99视频一区| 在线精品亚洲| 久久精品99国产精品| 久久超碰99| 999国产精品999久久久久久| 91精品一区二区三区综合| 图片区亚洲欧美小说区| 日韩精品一区第一页| 日本a级不卡| 欧美激情另类| 亚洲一区久久| 欧美国产日本| 午夜久久福利| 欧美日韩中出| 精品精品久久| 亚洲视频www| 久久超碰99| 狠狠干成人综合网| 国产精品毛片久久久| 亚洲电影有码| 少妇高潮一区二区三区99| 成人国产精品久久| 亚洲深夜av| 成人三级高清视频在线看| 丝袜亚洲另类欧美| 欧美激情三区| 石原莉奈一区二区三区在线观看 | 91亚洲国产高清| 男女男精品网站| 九九99久久精品在免费线bt| 在线午夜精品| 日韩电影免费在线观看| 婷婷五月色综合香五月| 久久中文字幕av| 精品国产网站| 欧美亚洲三级| 热久久免费视频| 久久久久中文| 国产aⅴ精品一区二区三区久久| 亚洲精品日本| 国产一区二区精品| 国产精品国产一区| 日韩国产在线观看一区| 国产精品毛片在线看| 久久精品99久久无色码中文字幕| 久久久91麻豆精品国产一区| 欧美另类中文字幕 | 亚洲欧洲专区| 久久一二三区| 香蕉久久久久久久av网站| 久久精品免费一区二区三区| 中文在线а√在线8| 捆绑调教日本一区二区三区| 国产精品网站在线看| 日韩国产欧美三级| 日韩久久一区| 国产精品中文字幕亚洲欧美| 国产精品中文字幕亚洲欧美| 国产精品777777在线播放 | 999精品色在线播放| 日韩成人高清| 91精品综合| 美女国产一区| 日韩一区免费| 欧美一级久久| 91成人精品在线| 麻豆一区二区三区| 亚洲精品**中文毛片| 99成人在线视频| 亚洲综合不卡| 啪啪亚洲精品| 国内精品亚洲| 欧美特黄一级| 日本午夜精品久久久久| 成午夜精品一区二区三区软件| 国产精品高颜值在线观看| 五月婷婷亚洲| 欧美亚洲综合视频| 麻豆精品在线观看| 成人久久一区| 亚洲一区二区毛片| 国产精区一区二区| 99精品在线| 国产日产一区| 亚洲天堂黄色| 国产精品久久亚洲不卡| 久久国产精品成人免费观看的软件| 丝袜美腿高跟呻吟高潮一区| 久久精品一本| 最新国产精品| 久久91导航| 欧美一区激情| 9色国产精品| 欧美gv在线| 欧美精品国产白浆久久久久| 综合日韩av| 日本精品国产| 99日韩精品| 久久久夜夜夜| 久久99蜜桃| 日韩福利视频网| 欧美日韩精品免费观看视频完整| 久久久精品国产**网站| 亚洲欧美在线综合| 99久久夜色精品国产亚洲1000部| 91精品国产自产在线丝袜啪| 欧美日韩四区| 国内亚洲精品| 亚洲爱爱视频| 亚洲黄色免费看| 国产精品99精品一区二区三区∴ | 欧美精品1区| 亚洲人www| 蜜臀av一区二区三区| 91精品国产成人观看| 黄色在线网站噜噜噜| 精品国产一区二| 久久久91麻豆精品国产一区| 日本视频一区二区| 日本视频中文字幕一区二区三区| 伊人www22综合色| 日韩中文字幕亚洲一区二区va在线 | 日本一区二区高清不卡| 久久精品国产999大香线蕉| 欧美日韩a区| 国产日韩欧美一区| 国产精品一区免费在线| 日本一不卡视频| 日日夜夜免费精品| 日韩av资源网| 国产精品主播| 国产成人精品三级高清久久91 | 欧美有码在线| 高清久久精品| 国产高清不卡| 夜夜精品视频| 91精品丝袜国产高跟在线| 国产毛片久久久| 国产一区2区| 影院欧美亚洲| 国产欧美另类| 日本综合字幕| 老司机精品久久| 三级欧美韩日大片在线看| 久久国产三级精品| 国产精选在线| 美女精品在线观看| 老鸭窝一区二区久久精品| 久久免费黄色| 久久成人一区| 国产一区二区三区四区大秀| 亚洲小说欧美另类婷婷| 日韩精品中文字幕吗一区二区| 久久一区欧美| 天堂网在线观看国产精品| 国产精品视频一区视频二区| 日韩在线第七页| 亚洲一级大片| 日韩成人亚洲| 日本午夜精品视频在线观看| 亚洲无线一线二线三线区别av| 四虎精品永久免费| 99精品在线| 成人在线丰满少妇av| 国产亚洲精品自拍| 国产精品手机在线播放| 久久亚洲美女| 激情久久五月| av资源中文在线天堂| 国产日产高清欧美一区二区三区 | 91成人福利| 亚洲免费一区二区| 久久精品亚洲人成影院 | 亚洲韩日在线| 久久精品国产精品亚洲毛片| 亚洲一区二区成人| 久久精品国产www456c0m| 欧美好骚综合网| 国产精品手机在线播放| 日韩av不卡在线观看| 亚洲精品小说| 亚洲特色特黄| 日韩不卡在线| 精品国模一区二区三区| 国产美女高潮在线观看| 精品视频国产| 国内精品伊人| 国产一区2区在线观看| 国产在视频一区二区三区吞精| 日韩激情网站| 中文字幕av一区二区三区四区| 欧美日韩少妇| 伊人久久一区| 视频一区日韩| 国产精品一在线观看| 精品久久91|