對JavaScript中原型及原型鏈的理解

什麼是原型:

  1,我們所創建的每一個函數,解析器都會向該函數對象添加一個屬性prototype,這個屬性指向一個對象,這個對象就是我們所謂的原型對象

  2,如果我們將函數作為普通函數調用時,prototype基本沒有任何作用;當函數作為構造函數使用時,構造函數所創建的對象中都會有一個隱含屬性,這個隱含屬性指向創建它的構建函數的原型對象(好像有點繞……),我們可以通過__proto__來訪問該屬性

  3,原型對象就相當於一個公共的區域,所有同一個類的實例都可以訪問到這個原型對象(我們可以將對象中共有的內容,統一設置到原型對象中)

使用方法或者屬性時的一個內部查找順序(有必要知曉):

  (1)當訪問一個對象的屬性/方法時,首先查找這個對象自身有沒有該屬性

  (2)如果沒有就查找它的原型(也就是__proto__指向的構造函數prototype原型對象)

  (3)如果還沒有找到就查找原型對象的原型,就是prototype.__proto__,它應該是指向Object構造函數的原型對象-我理解為原型對象是由Obejct這個構造函數創建的

  (4)依次類推,如果還沒有,則它會查找Object構造函數原型的原型,也就是Object構造函數的prototype.__proto__,如果列印它,你會發現它是null

  

 

原型鏈:

 

 

 

ps:有沒有覺得很像一個鏈條呢

總結:

  我們這裡需要重點知曉的是,原型對象也是對象,是對象就是用構造函數創建出來的,而最終他們都指向Object的構造函數的原型對象的原型對象,也就是null;事實上,我們可以把Object構造函數當做是一切對象的祖先(包括Function構造函數,它的__proto__也是指向Object),還需要知曉Js內部查找屬性和方法的一個規則,熟知這些,那麼理解原型和原型鏈就沒什麼難度了

  嗯嗯……,寫的好像有點亂,如果有大佬發現此文中的錯誤,可以指正出來,畢竟才接觸前端沒多久,只是個人對原型的一些總結和理解,如果後續有更深入的理解或有更簡潔的描述,會再進行補充或修改