當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
图解JavaScript原型链继承
生活随笔
收集整理的這篇文章主要介紹了
图解JavaScript原型链继承
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
JavaScript是基于原型鏈的繼承的,忘掉類的繼承,從原型鏈入手。
普通對(duì)象 函數(shù)對(duì)象
- JavaScrip只有一種結(jié)構(gòu):對(duì)象
- 通過new Function()創(chuàng)建的對(duì)象都是函數(shù)對(duì)象,其他都是普通對(duì)象。
- 每個(gè)對(duì)象都有 __proto__屬性,,并且該屬性指向原型對(duì)象(prototype),但只有函數(shù)對(duì)象才有 prototype 屬性
prototype和 proto 的概念
prototype是函數(shù)的一個(gè)屬性(函數(shù)都有prototype屬性)指向原型對(duì)象。 _ proto_ 是一個(gè)對(duì)象擁有的內(nèi)置屬性(請(qǐng)注意:prototype是函數(shù)的內(nèi)置屬性,_ proto_ 是對(duì)象的內(nèi)置屬性),_ proto_ 是JS內(nèi)部使用尋找原型鏈的屬性。簡單來說,在 javascript 中每個(gè)對(duì)象都會(huì)有一個(gè) _ proto _,方法也是對(duì)象,也有這個(gè)屬性。 屬性,當(dāng)我們?cè)L問一個(gè)對(duì)象的屬性時(shí),如果這個(gè)對(duì)象內(nèi)部不存在這個(gè)屬性,那么他就會(huì)去 _ proto _ 里找這個(gè)屬性,這個(gè) _ proto _ 又會(huì)有自己的 _ proto _,于是就這樣一直找下去,也就是我們平時(shí)所說的原型鏈的概念.
(上圖引用自其他博客以方便理解)原型鏈
- 屬性查找機(jī)制: 當(dāng)查找對(duì)象的屬性時(shí),如果實(shí)例對(duì)象自身不存在該屬性,則沿著原型鏈往上一級(jí)查找,找到時(shí)則輸出,不存在時(shí),則繼續(xù)沿著原型鏈往上一級(jí)查找,直至最頂級(jí)的原型對(duì)象Object.prototype,如還是沒找到,則輸出undefined。
- 屬性修改機(jī)制: 只會(huì)修改實(shí)例對(duì)象本身的屬性,如果不存在,則進(jìn)行添加該屬性,如果需要修改原型的屬性時(shí),則可以用: b.prototype.x = 2;但是這樣會(huì)造成所有繼承于該對(duì)象的實(shí)例的屬性發(fā)生改變。
總結(jié)
- Function的兩個(gè)指針prototype和_ proto _ 均指向 Function.protptype
- 構(gòu)造函數(shù)通過prototype屬性獲取原型對(duì)象。
- 原型對(duì)象通過constructor屬性獲取構(gòu)造函數(shù)
- 對(duì)象通過__proto__(非標(biāo)準(zhǔn),隱式原型)屬性獲取原型對(duì)象。
- 構(gòu)造函數(shù)的prototype(標(biāo)準(zhǔn),顯式原型)屬性指向上一級(jí)原型對(duì)象直到Object原型對(duì)象。
- Object.prototype.__proto__指向null
- 所有的對(duì)象最終都繼承于Object.prototype,而所有的構(gòu)造函數(shù),包括Function(){} Object(){}在內(nèi),又都可以看做是Function的實(shí)例
- Obj.hasOwnProperty()可以判斷某個(gè)對(duì)象本身是否有某個(gè)屬性,函數(shù)也是對(duì)象。
總結(jié)
以上是生活随笔為你收集整理的图解JavaScript原型链继承的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android隐藏EditText长按菜
- 下一篇: XSS和CSRF详解与防御