国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

如何理解JavaScript的原型和原型鏈?

adie / 785人閱讀

摘要:之前有朋友問怎么去理解原型和原型鏈的問題。理解原型鏈的小技巧將箭頭視作泛化子類到父類關系那么圖中所有的虛線將構成一個繼承層級,而實線表示屬性引用。原型鏈是實現繼承的重要方式,原型鏈的形成是真正是靠而非。

之前有朋友問怎么去理解原型和原型鏈的問題。這個問題,在面試中,很多同學經常都會遇到。這里給大家講講,方便大家記憶。
JavaScript的特點
JavaScript是一門直譯式腳本語言,是一種動態類型、基于原型的語言。 JavaScript的靈活性不亞于C++,你可以使用JavaScript嘗試不同的程序設計范型。
比如類jQuery風格的函數式編程、基于過程的指令式編程、以及基于原型的面向對象編程。
不同于Java、C#等面向對象語言,JavaScript采用基于原型的繼承方式。
為啥會有原型和原型鏈?
1994年,網景公司(Netscape)發布了Navigator瀏覽器0.9版,但是剛開始的Js沒有繼承機制,更別提像同時期興盛的C++和Java這樣擁有面向對象的概念。在實際的開發過程中,工程師們發現沒有繼承機制很難解決一些問題,必須有一種機制能將所有的對象關聯起來。
Brendan Eich鑒于以上情況,但不想把Js設計得過為復雜,于是引入了new關鍵詞和constructor構造函數來簡化對象的設計,引入了prototype函數對象來包含所有實例對象的構造函數的屬性和方法,引入了proto和原型鏈的概念解決繼承的問題。
原型模式
每個函數都有一個prototype(原型)屬性
這個屬性都有一個指針,指向一個對象
這個對象包含由特定類型所有實例共享的屬性和方法
使用原型的好處是可以讓所有對象實例共享它包含的方法和屬性
通過in操作符和hasOwnProperty來判斷給定屬性是來自于原型還是實例
in- true 代表屬性在對象中存在 來自實例或者來自原型
hasOwnProperty- true代表屬性來自于實例 是實例屬性
原型鏈
ECMAScript中只支持實現繼承,而且是通過原型鏈的方式來實現的。所以原型鏈是JavaScript實現繼承的一種重要方式。
用戶定義類型的原型鏈
我們一般如何來檢查JavaScript的變量數據類型?一般我們都是通過instanceof關鍵字,可以基于原型鏈來檢測變量的類型。
我們可以先構造一個原型鏈,再用instanceof來檢測類型:


????由上面講的instanceof的結果,可以判斷這些類型的繼承層級:

??事實上instanceof是通過原型鏈來檢測類型的,例如L instanceof R: 如果R.prototype出現在了L的原型鏈上則返回true,否則返回false。
用JavaScript來描述instanceof的實現邏輯是這樣的:

??JavaScript原型鏈
先給大家看一個JavaScript的原型鏈結構圖。

理解原型鏈的小技巧: 將__proto__箭頭視作泛化(子類到父類)關系!
那么圖中所有的虛線將構成一個繼承層級,而實線表示屬性引用。
圖中給出了Object.prototype.__proto__ == null,但它還沒有標準化,在Chrome、Safari和Node.js下它是不同的東西。
但可以看到JavaScript中所有對象的共同隱式原型為Object.prototype,它的上一級隱式原型是什么已經不重要了, 因為它不會影響所有內置對象以及用戶定義類型的原型鏈結構。
上圖其實已經解釋了不同內置對象instanceof的行為,我們來看Function和Object的特殊之處:
Object是由Function創建的:因為Object.__proto__ === Funciton.prototype;
同理,Function.prototype是由Object創建的;
Funciton是由Function自己創建的!
Object.prototype是憑空出來的!
現在我們可以解釋特殊對象的instance行為了:

??另外可以看到當你聲明一個函數(比如Animal)時,Animal.prototype會自動被賦值為一個繼承自Object的對象, 而且該對象的constructor等于Animal。即:
??
值得注意的是Animal如果被Cat繼承,Cat實例(比如cat)的constructor仍然是Animal。
??
總結
1.每個函數對象都有一個 prototype 屬性,這個屬性就是函數的原型對象。
2.原型鏈是JavaScript實現繼承的重要方式,原型鏈的形成是真正是靠__proto__ 而非prototype。

喜歡文章的可以關注小編~

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/103475.html

相關文章

  • 如何理解JavaScript原型原型

    摘要:之前有朋友問怎么去理解原型和原型鏈的問題。理解原型鏈的小技巧將箭頭視作泛化子類到父類關系那么圖中所有的虛線將構成一個繼承層級,而實線表示屬性引用。原型鏈是實現繼承的重要方式,原型鏈的形成是真正是靠而非。 之前有朋友問怎么去理解原型和原型鏈的問題。這個問題,在面試中,很多同學經常都會遇到。這里給大家講講,方便大家記憶。 JavaScript的特點JavaScript是一門直譯式腳本...

    xuexiangjys 評論0 收藏0
  • 【5】JavaScript 函數高級——原型原型深入理解(圖解)

    摘要:探索是如何判斷的表達式如果函數的顯式原型對象在對象的隱式原型鏈上,返回,否則返回是通過自己產生的實例案例案例重要注意的顯示原型和隱式原型是一樣的。面試題測試題測試題報錯對照下圖理解 原型與原型鏈深入理解(圖解) 原型(prototype) 函數的 prototype 屬性(圖) 每個函數都有一個prototype屬性,它默認指向一個Object空對象(即稱為:原型對象) 原型對象中有...

    馬龍駒 評論0 收藏0
  • 深入理解JavaScript系列5:強大原型原型

    摘要:參考內容關于本文本文轉自大叔的深入理解系列深入理解系列文章,包括了原創,翻譯,轉載,整理等各類型文章,原文是大叔的一個非常不錯的專題,現將其重新整理發布。 前言 JavaScript 不包含傳統的類繼承模型,而是使用 prototypal 原型模型。 雖然這經常被當作是 JavaScript 的缺點被提及,其實基于原型的繼承模型比傳統的類繼承還要強大。實現傳統的類繼承模型是很簡單,但是...

    frontoldman 評論0 收藏0
  • 詳解javascript

    摘要:原文地址詳解的類博主博客地址的個人博客從當初的一個彈窗語言,一步步發展成為現在前后端通吃的龐然大物。那么,的類又該怎么定義呢在面向對象編程中,類是對象的模板,定義了同一組對象又稱實例共有的屬性和方法。這個等同于的屬性現已棄用。。 前言 生活有度,人生添壽。 原文地址:詳解javascript的類 博主博客地址:Damonare的個人博客 ??Javascript從當初的一個彈窗語言,一...

    hufeng 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<