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

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

深入理解 javaScript 原型繼承

瀏覽:20日期:2023-11-15 09:25:32
繼承的本質:重用

在探討 javaScript 的原型繼承之前,先不妨想想為什么要繼承?

考慮一個場景,如果我們有兩個對象,它們一部分屬性相同,另一部屬性不同。通常一個好的設計方案是將相同邏輯抽出來,實現重用。

以 xiaoMing liLei 兩位同學舉例。這兩位同學有自己的名字,并且會介紹自己。抽象為程序對象,可以做如下表示。

var xiaoMing = { name : 'xiaoMing', hello : function(){ console.log( ’Hello, my name is ’+ this.name + ’.’); }}var liLei = { name : 'liLei', hello : function(){ console.log( ’Hello, my name is ’+ this.name + ’.’); }}

使用過 java 的同學,可能第一眼就想到了用面向對象來解決這個問題。創造一個 Person 的類,然后實例化 xiaoMing 和 liLei 兩個對象。在 ES6 中也有類似于 java 中類的概念: class 。

下面使用 ES6 的語法,用面向對象的思路來重構上面的代碼。

class Person { constructor(name){ this.name = name } hello(){ console.log(this.name); }}var xiaoMing = new Person(’xiaoMing’);var liLei = new Person(’liLei’);

可以看到,使用類創建對象,達到了重用的目的。它基于的邏輯是,兩個或多個對象的結構功能類似,可以抽象出一個模板,依照模板復制出多個相似的對象。

使用類創建對象,就像自行車制造商一遍一遍地重用相同的藍圖來制造大量的自行車。

然解決重用問題的方案,當然不止一種。傳統面向對象的類,只是其中的一種方案。下面輪到我們的主角“原型繼承”登場了,它從另一個角度解決了重用的問題。

原型繼承的原理 原型對象

javaScript 中的 object 由兩部分組成,普通屬性的集合,和原型屬性。

var o = { a : ’a’, ... __proto__: prototypeObj}

普通屬性指的就是 a ; 原型屬性 指的是 __proto__ 。這本不屬于規范的一部分,后來 chrome 通過 __proto__ 將這個語言底層屬性給暴露出來了,慢慢的被大家所接受,也就添加到 ES6 規范中了。 o.__proto__ 的值 prototypeObj 也就是 原型對象 。原型對象其實也就是一個普通對象,之所以叫原型對象的原因,只是因為它是原型屬性所指的值。

原型對象所以特殊,是因為它擁有一個普通對象沒有的能力:將它的屬性共享給其他對象。

在 ES6 規范 中,對它是如下定義的:

object that provides shared properties for other objects 屬性讀操作

回到最開始的例子,看看如何利用原型繼承實現重用的目的。

var prototypeObj = { hello: function(){ console.log( ’Hello, my name is ’+ this.name + ’.’); } // ...}var xiaoMing = { name : 'xiaoMing', __proto__ : prototypeObj}var liLei = { name : 'liLei', __proto__ : prototypeObj}xiaoMing.hello(); // Hello, my name is xiaoMing.liLei.hello(); // Hello, my name is liLei.

xiaoMing liLei 對象上,并沒直接擁有 hello 屬性(方法),但是卻能讀取該屬性(執行該方法),這是為什么?

想象一個場景,你在做數學作業,遇到一個很難的題目,你不會做。而你有一個好兄弟,數學很厲害,你去請教他,把這道題做出來了。

xiaoMing 對象上,沒有 hello 屬性,但是它有一個好兄弟, prototypeObj 。屬性讀操作,在 xiaoMing 身上沒有找到 hello 屬性,就會去問它的兄弟 prototypeObj 。所以 hello 方法會被執行。

原型鏈

還是做數學題的例子。你的數學題目很難,你的兄弟也沒有答案,他推薦你去問另外一個同學。這樣直到有了答案或者再也沒有人可以問,你就不會再問下去。這樣就好像有一條無形鏈條把你和同學們牽在了一起。

在 JS 中,讀操作通過 __proto__ 會一層一層鏈下去的結構,就叫 原型鏈 。

var deepPrototypeObj = { hello: function(){ console.log( ’Hello, my name is ’+ this.name + ’.’); } __proto__ : null}var prototypeObj = { __proto__ : deepPrototypeObj}var xiaoMing = { name : 'xiaoMing', __proto__ : prototypeObj}var liLei = { name : 'liLei', __proto__ : prototypeObj}xiaoMing.hello(); // Hello, my name is xiaoMing.liLei.hello(); // Hello, my name is liLei. 原型繼承的實現

在上面的例子中,通過直接修改了 __proto__ 屬性值,實現了原型繼承。但是在實際生產中,

代替的方式是使用 Object.create() 方法。

調用 Object.create() 方法會創建一個新對象,同時指定該對象的原型對象為傳入的第一個參數。

我們將上面的例子改一下。

var prototypeObj = { hello: function(){ console.log( ’Hello, my name is ’+ this.name + ’.’); } // ...}var xiaoMing = Object.create(prototypeObj);var liLei = Object.create(prototypeObj);xiaoMing.name = 'xiaoMing';liLei.name = 'liLei';xiaoMing.hello(); // Hello, my name is xiaoMing.liLei.hello(); // Hello, my name is liLei.

You-Dont-Know-JS 的作者,對這種原型繼承的實現取了一個很好玩的名字 OLOO (objects-linked-to-other-objects) ,這種實現方式的優點是沒有使用任何類的概念,只有 object ,所以它是很符合 javaScript 的特性的。

因為JS 中本無類,只有 object 。

無奈的是,喜歡類的程序員是在太多,所以在 ES6 新增了 class 概念。下一篇會講 class 在 JS 中的實現原理

小結

類創建對象,達到了重用的目的。它基于的邏輯是,兩個或多個對象的結構功能類似,可以抽象出一個模板,依照模板 復制 出多個相似的對象。就像自行車制造商一遍一遍地重用相同的藍圖來制造大量的自行車。

使用原型繼承,同樣可以達到重用的目的。它基于的邏輯是,兩個或多個對象的對象有一部分共用屬性,可以將共用的屬性抽象到另一個獨立公共對象上,通過特殊的原型屬性,將公共對象和普通對象鏈接起來,再利用屬性讀(寫)規則進行遍歷查找,實現屬性 共享

來自:https://segmentfault.com/a/1190000008293372

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产日韩免费| 欧美伊人影院| 97精品一区二区| 天堂网在线观看国产精品| 久久国产福利| 欧美精品99| 欧洲激情综合| 国产午夜精品一区在线观看| 成人自拍av| 亚州av日韩av| 97精品一区二区| 亚洲视频电影在线| av高清不卡| 日韩欧美久久| 伊人久久高清| 欧美片第1页综合| 欧美日韩尤物久久| 婷婷精品在线| 日本精品影院| 国产精品美女午夜爽爽| 国产99久久| 国产伦精品一区二区三区视频| 99国产精品免费视频观看| 91午夜精品| 亚洲午夜91| 麻豆一区二区三| 免费观看日韩电影| 国产999精品在线观看| 蜜臀精品久久久久久蜜臀| 国产一区二区三区不卡视频网站 | 视频一区欧美精品| 激情黄产视频在线免费观看| 一区二区精彩视频| 91精品国产自产在线观看永久∴| 欧美日韩一区二区三区不卡视频 | 日韩精品2区| 国产精品一区二区三区av| 在线一区电影| 毛片在线网站| 欧美交a欧美精品喷水| 亚洲精品在线国产| 五月婷婷六月综合| 精品福利久久久| 国产精品流白浆在线观看| 亚洲三级观看| 亚洲精品888| 亚洲成a人片| 成人在线视频中文字幕| 国产精品调教| 日本欧美在线| 亚洲a成人v| 亚洲香蕉久久| 亚洲一区免费| 黑丝一区二区三区| 不卡中文字幕| 成人av动漫在线观看| 国产99精品| 欧美日韩一二| 三级在线看中文字幕完整版| 美女久久精品| 美女视频网站久久| 国产精品久久久久77777丨 | 久久久国产精品一区二区中文| 麻豆理论在线观看| 国产精品99一区二区三区| 精品三区视频| 精品国产麻豆| 精品久久不卡| 久久超碰99| 欧美国产三级| 久久99精品久久久野外观看| 欧美日韩xxxx| 国产黄色一区| 久久久精品区| 国产一区二区三区久久 | 国产精品中文字幕亚洲欧美 | 欧美日韩91| 国产精品一区二区三区av| 国产欧美一区二区精品久久久 | 日韩精品免费视频一区二区三区 | 精品三级久久久| 久草免费在线视频| 久久久久国产精品一区二区| 日本精品在线中文字幕| 亚洲一级网站| 丝袜美腿亚洲一区| 日本在线视频一区二区| 欧美日韩a区| 久久精品国产精品亚洲毛片| 国产色播av在线| 亚洲福利久久| 亚洲欧美久久久| 日本综合精品一区| 久久av免费看| 四虎4545www国产精品| 99在线观看免费视频精品观看| 亚洲日产av中文字幕| 国产欧美一区二区色老头| 国产伊人久久| 不卡在线一区| 日韩av黄色在线| 国产成人黄色| 国产精品老牛| 国产精品三p一区二区| 亚洲va中文在线播放免费| 中文国产一区| 国产欧美日韩亚洲一区二区三区| 成人在线视频区| 亚洲专区欧美专区| 美女国产精品久久久| 午夜精品影院| 久久精品 人人爱| 性欧美xxxx免费岛国不卡电影| 丝袜亚洲精品中文字幕一区| 欧美日韩一区自拍| 久久婷婷亚洲| 日韩激情中文字幕| 夜鲁夜鲁夜鲁视频在线播放| 老牛国产精品一区的观看方式| 麻豆久久一区| 亚洲自啪免费| 久久精品国产成人一区二区三区| 一级欧洲+日本+国产| 国产欧美一级| 亚洲黄色影院| 久久精品国产在热久久| 亚洲永久字幕| 成人三级高清视频在线看| 在线国产日韩| 久久婷婷亚洲| 国产欧美日韩综合一区在线播放| 欧美福利在线| 久久不见久久见中文字幕免费| 亚洲女同中文字幕| 精品视频91| 视频一区日韩| 欧美日韩一区二区三区视频播放| 日韩一区二区三免费高清在线观看| 97欧美在线视频| 日本精品久久| 午夜在线一区| av亚洲一区二区三区| 美腿丝袜亚洲一区| 亚洲精品无播放器在线播放| 久久精品国产www456c0m| 国产区精品区| 综合国产在线| 亚洲精品2区| 激情黄产视频在线免费观看| 国产欧美一区二区三区国产幕精品| 亚洲经典在线| 日本高清不卡一区二区三区视频| 久久av电影| 婷婷综合国产| 免费看黄色91| 亚洲精品中文字幕乱码| 欧美xxxx中国| 国产精品亚洲四区在线观看 | 日本不卡一区二区三区| 午夜日本精品| 三级小说欧洲区亚洲区| 国产成人精选| 国产精久久一区二区| 视频一区日韩精品| 亚洲天堂免费| 中文精品在线| 一区二区视频欧美| 国产99精品| 99精品视频在线观看免费播放| 黄色在线观看www| 91视频久久| 日本激情一区| bbw在线视频| 亚洲精品永久免费视频| 岛国av在线网站| 日韩精品诱惑一区?区三区| 国产伦久视频在线观看| 91综合视频| 色爱av综合网| 亚洲二区免费| 亚洲欧美日韩高清在线| 99视频一区| 亚洲色图网站| 青草国产精品| 国产精品久久久久77777丨| 国产精品第一| 欧美激情另类| 99久久久久| 亚洲精华国产欧美| 首页欧美精品中文字幕| 综合在线一区| 日本不卡高清| 国产乱论精品| 精品国产午夜肉伦伦影院| 色婷婷综合网| 欧洲av一区二区| 欧美在线亚洲综合一区| 中文字幕亚洲在线观看| 欧美日韩亚洲一区二区三区在线| 欧美日韩91|