中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

JavaScript中的原型繼承基礎學習教程
來源:易賢網 閱讀:976 次 日期:2016-07-02 13:19:05
溫馨提示:易賢網小編為您整理了“JavaScript中的原型繼承基礎學習教程”,方便廣大網友查閱!

這篇文章主要介紹了JavaScript中的原型繼承基礎學習教程,基于原型prototype的繼承是JavaScript中實現面向對象中的繼承特性的基本手段,需要的朋友可以參考下

大多數編程語言中,都有類和對象,一個類可以繼承其他類。

在JavaScript中,繼承是基于原型的(prototype-based),這意味著JavaScript中沒有類,取而代之的是一個對象繼承另一個對象。:)

1. 繼承, the proto

在JavaScript中,當一個對象rabbit繼承另一了對象animal時,這意味著rabbit對象中將會有一個特殊的屬性:rabbit.__proto__ = animal;

當訪問rabbit對象時,如果解釋器在rabbit中不能找到屬性,那么它會順著__proto__鏈往上在animal對象中尋找

栗子中的__proto__屬性僅在Chrome和FireFox中可以訪問,請看一個栗子:

var animal = { eats: true }

var rabbit = { jumps: true }

rabbit.__proto__ = animal // inherit

alert(rabbit.eats) // true

eats屬性是從animal對象中訪問的。

如果在rabbit對象中已經發現了屬性,那么就不會去檢查proto屬性啦。

再來一個栗子,當子類中也有eats屬性時,父類中的就不會訪問了。

var animal = { eats: true }

var fedUpRabbit = { eats: false}

fedUpRabbit.__proto__ = animal 

alert(fedUpRabbit.eats) // false

你也可以在animal中添加一個函數,那么在rabbit中也可以訪問了。

var animal = {

 eat: function() {

  alert( "I'm full" )

  this.full = true

 }

}

var rabbit = {

 jump: function() { /* something */ }

}

rabbit.__proto__ = animal 

(1)rabbit.eat():

rabbit.eat()函數以如下兩步執行:

首先,解釋器查找rabbit.eat,rabbit中沒有eat函數,那么它就順著rabbit.__proto__往上找,在animal中找到了。

函數以this = rabbit運行。this值與__proto__屬性完全無關。

因此,this.full = true在rabbit中:

看看這里我們有什么新發現,一個對象調用了父類函數,但是this還是指向對象本身,這就是繼承。

被__proto__引用的對象稱作是原型(prototype),animal是rabbit的原型(譯者注:這就是rabbit的__proto__屬性引用了animal 的prototype屬性)

(2)讀時查找,不是寫時

當讀取一個對象時,比如this.prop,解釋器會在它的原型中查找屬性。

當設置一個屬性值時,比如this.prop = value,那么就沒有理由去查找了,這個屬性(prop)會被直接添加到這個對象中(這里是this)。delete obj.prop也類似,它只刪除對象本身的屬性,原型中的屬性保持原封不動。

(3)關于proto

如果你在閱讀指南,這里我們叫的__proto__,在指南中表示為[[Prototype]]。雙方括號是很重要的,因為有另一個屬性叫做prototype。

2. Object.create, Object.getPrototypeOf

__proto__是一個非標準的屬性,由Chrome/FireFox提供訪問,在其他的瀏覽器中保持不可見。

所有的現代瀏覽器除了Opera(IE > 9)支持兩個標準的函數來處理原型問題:

Object.ceate(prop[,props])

用給定了proto創建一個空對象:

var animal = { eats: true }

rabbit = Object.create(animal)

alert(rabbit.eats) // true

上面代碼創建了一個空rabbit對象,并且原型設置為animal

rabbit對象創建好以后,我們可以往里添加屬性了:

var animal = { eats: true }

rabbit = Object.create(animal)

rabbit.jumps = true

Object.creat函數的第二個參數props是可選的,它允許像新對象設置屬性。這里就省略了,因為我們關系的繼承。

(1)Object.getPrototypeOf(obj)

返回obj.__proto__的值。這個函數是標準的,可以在不能直接訪問__proto__屬性的瀏覽器中使用了。

var animal = {

 eats: true

}

rabbit = Object.create(animal)

alert( Object.getPrototypeOf(rabbit) === animal ) // true

現代瀏覽器允許讀取__proto__屬性值,但是不能設置。

3. The prototype

有一些好的跨瀏覽器的方式設置__proto__屬性,這將會使用構造器函數(constructor functions)。記住!任何函數創建一個對象都是通過new關鍵字的。

一個栗子:

function Rabbit(name) {

 this.name = name

}

var rabbit = new Rabbit('John')

alert(rabbit.name) // John

new操作將原型的屬性設置到rabbit對象的的__proto__屬性中了。

讓我們來看看它的原理,例如,new Rabbit 對象,而Rabbit是繼承animal 的。

var animal = { eats: true }

function Rabbit(name) {

 this.name = name

}

Rabbit.prototype = animal

var rabbit = new Rabbit('John')

alert( rabbit.eats ) // true, because rabbit.__proto__ == animal

Rabbit.prototype = animal 字面量意味著:對所有由new Rabbit創建的對象設__proto__ = animal

4. 跨瀏覽器 Object.create(proto)

Object.create(prop)函數功能的強大的,因為它允許從給定的對象直接繼承。它可以由如下代碼模擬:

function inherit(proto) {

 function F() {}

 F.prototype = proto

 return new F

}

inherit(animal) 與Object.create(animal)是完全等同的,返回一個空的對象,并且object.__proto__ = animal。

一個栗子:

var animal = { eats: true }

var rabbit = inherit(animal)

alert(rabbit.eats) // true

alert(rabbit.hasOwnProperty('eats')) // false, from prototype

來看一下它的原理是什么:

function inherit(proto) {

 function F() {}   // (1)

 F.prototype = proto // (2)

 return new F()   // (3)

}

(1) 創建了一個新函數,函數沒有向this設置任何屬性,以此`new F` 會創建一個空對象。

(2) `F.prototype`被設置為proto

(3) `new` F創建了一個空對象,對象的`__proto__ = F.prototype` 

(4) Bingo! 我們得到了一個繼承`proto`的空對象

這個函數廣泛適用于各種庫和框架之中。

你的函數接受了一個帶有options 的對象

/* options contains menu settings: width, height etc */

function Menu(options) {

 // ...

}

你想設置某些options

function Menu(options) {

 options.width = options.width || 300 // set default value

 // ...

}

。。。但是改變參數值可能會產生一些錯誤的結果,因為options可能會在外部代碼中使用。一個解決辦法就是克隆options對象,復制所有的屬性到一個新的對象中,在新對象中修改,

怎樣用繼承來解決這個問題呢? P.S. options可以添加設設置,但是不能被刪除。

Solution

你可以繼承options,并且在它的子類的中修改或者添加新的屬性。

function inherit(proto) {

 function F() {}

 F.prototype = proto

 return new F

}

function Menu(options) {

 var opts = inherit(options)

 opts.width = opts.width || 300

 // ...

}

所有的操作只在子對象中有效,當Menu方法結束時,外部代碼仍然可以使用沒有修改的過的options對象。delete操作在這里非常重要,如果width是一個prototype中的屬性,delete opts.width不會產生任何作用

5. hasOwnProperty

所有的對象都有hasOwnProperty函數,它可以用來檢測一個屬性是否對象自身還是屬于原型

一個栗子:

function Rabbit(name) {

 this.name = name

}

Rabbit.prototype = { eats: true }

var rabbit = new Rabbit('John')

alert( rabbit.hasOwnProperty('eats') ) // false, in prototype

alert( rabbit.hasOwnProperty('name') ) // true, in object

6. Looping with/without inherited properties

for..in循環輸出一個對象的所有屬性,包括自身的和原型的。

function Rabbit(name) {

 this.name = name

}

Rabbit.prototype = { eats: true }

var rabbit = new Rabbit('John')

for(var p in rabbit) {

 alert (p + " = " + rabbit[p]) // outputs both "name" and "eats"

}

用hasOwnProperty可以過濾得到屬于對象自己的屬性:

function Rabbit(name) {

 this.name = name

}

Rabbit.prototype = { eats: true }

var rabbit = new Rabbit('John')

for(var p in rabbit) {

 if (!rabbit.hasOwnProperty(p)) continue // filter out "eats"

 alert (p + " = " + rabbit[p]) // outputs only "name"

}

7. Summary

JavaScript是通過一個特殊的屬性proto來實現繼承的

當訪問一個對象的屬性時,如果解釋器不能在對象中找到,它就會去對象的原型中繼續尋找 對函數屬性來說,this指向這個對象,而不是它的原型。

賦值obj.prop = value, 刪除delete obj.prop

管理proto:

Chrome和FireFox可以直接訪問對象的__proto__屬性,大多數現代瀏覽器支持用Object.getPrototypeOf(obj)只讀訪問。

Object.create(proto) 可以用給定的proto生成空的子對象,或者通過如下代碼達到相同的功能:

function inherit(proto) {

   function F() {}   

   F.prototype = proto

   return new F()  

  }

其他方法:

for..in循環輸出一個對象的所有屬性(包括自身的和原型的)和對象的原型鏈。

如果一個屬性prop屬于對象obj那么obj.hasOwnProperty(prop)返回true,否則返回false。

更多信息請查看網絡編程
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
影音先锋亚洲视频| 99国产欧美久久久精品| 亚洲最新在线| 狠狠爱www人成狠狠爱综合网| 欧美成人精品高清在线播放| 欧美呦呦网站| 亚洲欧美日韩一区二区三区在线观看 | 亚洲精品免费一区二区三区| 国产亚洲成精品久久| 国产精品久久久一区麻豆最新章节| 欧美精品一区在线观看| 欧美片在线观看| 欧美日韩精品中文字幕| 欧美黄色日本| 欧美日本不卡高清| 欧美日韩免费观看一区=区三区| 欧美电影免费观看高清| 免费不卡亚洲欧美| 免费看的黄色欧美网站| 久久久精品五月天| 两个人的视频www国产精品| 久久青草久久| 嫩草影视亚洲| 欧美母乳在线| 国产精品成人播放| 国产精品久久婷婷六月丁香| 国产精品地址| 国产日韩欧美一区二区| 激情久久影院| 亚洲精品久久久久久一区二区| 亚洲美女av电影| 亚洲欧美视频在线观看| 久久久久久久久久久久久女国产乱| 久久精品夜色噜噜亚洲aⅴ| 免费观看一级特黄欧美大片| 欧美日韩国产成人在线观看| 欧美日韩一区高清| 国产日韩综合一区二区性色av| 国产色综合久久| 亚洲日本中文字幕| 亚洲愉拍自拍另类高清精品| 欧美中文字幕视频在线观看| 麻豆乱码国产一区二区三区| 欧美区一区二区三区| 国产乱肥老妇国产一区二| 亚洲大片精品永久免费| 亚洲桃花岛网站| 久久人人爽人人爽| 国产精品国产三级欧美二区| 激情丁香综合| 亚洲深夜影院| 麻豆freexxxx性91精品| 国产精品户外野外| 亚洲国产精品久久久久久女王 | 亚洲日本欧美天堂| 亚洲天堂免费观看| 老司机一区二区三区| 国产精品久久999| 亚洲激情小视频| 欧美一级视频免费在线观看| 欧美xx69| 国产视频综合在线| 一区二区国产日产| 欧美成人a∨高清免费观看| 国产精品久久久久久久久久久久久久 | 国产揄拍国内精品对白| 亚洲精品视频免费观看| 久久国产精品72免费观看| 欧美精品一区在线观看| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲一区二区三区成人在线视频精品| 久久大综合网| 国产精品毛片一区二区三区 | 你懂的视频欧美| 国产日本欧美在线观看| 亚洲精品一二三| 久久久综合视频| 国产日韩欧美二区| 亚洲欧美一区二区视频| 国产精品成人午夜| 一本到12不卡视频在线dvd| 久久综合网络一区二区| 国产区亚洲区欧美区| 国产精品爱啪在线线免费观看| 亚洲第一精品在线| 久久这里只有| 国产在线欧美| 亚洲欧美中文另类| 欧美午夜精品理论片a级大开眼界| 亚洲裸体视频| 免费h精品视频在线播放| 好吊视频一区二区三区四区 | 久久xxxx精品视频| 国产精品成人免费视频| 亚洲美女黄色| 欧美精品自拍偷拍动漫精品| 亚洲三级电影在线观看| 欧美77777| 亚洲日韩第九十九页| 欧美激情国产日韩精品一区18| 影院欧美亚洲| 美女尤物久久精品| 亚洲激情第一区| 一区二区三区免费在线观看| 欧美日韩免费一区| 一区二区三区国产盗摄| 国产精品久久久久秋霞鲁丝| 亚洲少妇在线| 国产精品久久久久久影视 | 欧美一区二区在线观看| 国产农村妇女精品一区二区| 亚洲欧美日韩人成在线播放| 国产农村妇女毛片精品久久麻豆 | 亚洲国产高清视频| 玖玖精品视频| 亚洲三级毛片| 国产精品九色蝌蚪自拍| 亚洲欧美一区二区原创| 国产日韩一级二级三级| 麻豆九一精品爱看视频在线观看免费 | 国内精品久久久久影院 日本资源| 欧美一区二区三区男人的天堂 | 欧美精品二区| 一区二区三区成人精品| 国产欧美韩国高清| 久久综合伊人| 日韩亚洲欧美一区二区三区| 国产精品久久97| 久久美女艺术照精彩视频福利播放| 亚洲国产精品久久久久秋霞不卡| 欧美日韩精品一区视频| 欧美一区在线视频| 亚洲人成毛片在线播放女女| 国产精品男gay被猛男狂揉视频| 亚洲国产高清在线| 国产精品久久99| 蜜臀久久99精品久久久久久9| 亚洲免费观看视频| 国产婷婷色一区二区三区| 美女网站久久| 午夜视频在线观看一区二区三区| 在线观看日韩av| 国产精品老女人精品视频| 久久久久国产精品人| 中文在线一区| 亚洲国产精品视频| 国产午夜精品一区二区三区欧美| 欧美二区不卡| 久久久久国产精品一区| 一区二区三区国产精华| 狠狠色丁香婷综合久久| 国产精品卡一卡二| 欧美激情一区二区三区蜜桃视频| 欧美一区二区视频在线观看2020 | 中文日韩在线| 亚洲高清av| 国产视频一区二区三区在线观看| 欧美人成在线| 免费观看日韩av| 久久久久久久久久久成人| 亚洲砖区区免费| 国产精品一区视频| 欧美电影免费观看大全| 国产精品亚洲激情| 国产精品亚洲一区二区三区在线| 久久精品99| 国产日韩欧美电影在线观看| 欧美日本在线看| 国产日本欧美视频| 欧美国产免费| 久久亚洲精品中文字幕冲田杏梨 | 久久综合一区| 亚洲综合激情| 一本色道**综合亚洲精品蜜桃冫| 黄色国产精品| 国产午夜精品麻豆| 国产精品美女| 国产精品xvideos88| 欧美精品一级| 欧美黄色影院| 欧美成人激情视频| 免费在线看成人av| 欧美mv日韩mv国产网站app| 亚洲午夜av在线| 亚洲天堂av电影| 亚洲一区中文| 亚洲嫩草精品久久| 亚洲一区影音先锋| 亚洲永久在线| 性做久久久久久免费观看欧美| 亚洲欧美国产高清va在线播| 在线亚洲一区二区| 国产精品自在欧美一区| 国产亚洲精品美女| 狠狠爱www人成狠狠爱综合网| 国产在线精品一区二区中文| 黄色精品网站| 亚洲日本黄色| 中文久久乱码一区二区| 亚洲欧美精品在线|