日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

图解JavaScript原型链继承

發布時間:2024/4/13 javascript 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图解JavaScript原型链继承 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JavaScript是基于原型鏈的繼承的,忘掉類的繼承,從原型鏈入手。

普通對象 函數對象
  • JavaScrip只有一種結構:對象
  • 通過new Function()創建的對象都是函數對象,其他都是普通對象
  • 每個對象都有 __proto__屬性,,并且該屬性指向原型對象(prototype),但只有函數對象才有 prototype 屬性
prototype和 proto 的概念

prototype是函數的一個屬性(函數都有prototype屬性)指向原型對象。 _ proto_ 是一個對象擁有的內置屬性(請注意:prototype是函數的內置屬性,_ proto_ 是對象的內置屬性),_ proto_ 是JS內部使用尋找原型鏈的屬性。簡單來說,在 javascript 中每個對象都會有一個 _ proto _,方法也是對象,也有這個屬性。 屬性,當我們訪問一個對象的屬性時,如果這個對象內部不存在這個屬性,那么他就會去 _ proto _ 里找這個屬性,這個 _ proto _ 又會有自己的 _ proto _,于是就這樣一直找下去,也就是我們平時所說的原型鏈的概念.

(上圖引用自其他博客以方便理解)

原型鏈
  • 屬性查找機制: 當查找對象的屬性時,如果實例對象自身不存在該屬性,則沿著原型鏈往上一級查找,找到時則輸出,不存在時,則繼續沿著原型鏈往上一級查找,直至最頂級的原型對象Object.prototype,如還是沒找到,則輸出undefined。
  • 屬性修改機制: 只會修改實例對象本身的屬性,如果不存在,則進行添加該屬性,如果需要修改原型的屬性時,則可以用: b.prototype.x = 2;但是這樣會造成所有繼承于該對象的實例的屬性發生改變。
表達式:L instance R;則運算結果是: L.__proto__.__proto__... === R.prototype ?運算符左邊最終結果是 instanceof運算時會遞歸查找L的原型鏈,即L.__proto__.__proto__.__proto__.__proto__...直到找到了或者找到頂層為止。運算符右邊只是找出了 右邊操作數的prototype是什么。所以一句話總結:instanceof檢測左側操作數的__proto__原型鏈上,是否存在右側的prototype原型。 復制代碼
總結
  • Function的兩個指針prototype和_ proto _ 均指向 Function.protptype
  • 構造函數通過prototype屬性獲取原型對象。
  • 原型對象通過constructor屬性獲取構造函數
  • 對象通過__proto__(非標準,隱式原型)屬性獲取原型對象。
  • 構造函數的prototype(標準,顯式原型)屬性指向上一級原型對象直到Object原型對象。
  • Object.prototype.__proto__指向null
  • 所有的對象最終都繼承于Object.prototype,而所有的構造函數,包括Function(){} Object(){}在內,又都可以看做是Function的實例
  • Obj.hasOwnProperty()可以判斷某個對象本身是否有某個屬性,函數也是對象。

總結

以上是生活随笔為你收集整理的图解JavaScript原型链继承的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。