原型鏈

原型鏈

一、原型對象

在Javascript中,每一個構造函數在加載後都會在內存中自動生成一個原型對象,咱們能夠經過prototype屬性來訪問該對象。 數組

每一個構造函數定義後都會建立一個原型對象,不須要建立對象。構造函數中的prototype只能用 類名.prototype去訪問,constructor 只能用對象去訪問 函數

Person構造器與Person原型對象在內存中表現爲相互獨立,可是在Person構造函數的內部存在一個prototype屬性指向了Person原型對象。同理,在Person原型對象的內部也存在一個屬性constructor其指向了Person構造器。 spa

二、原型對象的做用

當構造器的實例化對象p1訪問一個不存在的屬性或方法時,系統會自動到當前構造器所指向的原型對象中去尋找。 prototype

說明:Person構造器的實例化對象p1訪問一個不存在的屬性constructor,系統會自動到當前Person構造器的原型對象中去尋找constructor屬性,因爲原型對象中的constructor屬性指向了Person構造器,因此當咱們調用p1.constructor時,系統會自動彈出Person構造器。 3d

給原型對象添加屬性後建立的全部對象都是能夠訪問 對象

三、原型對象的應用場景

在實際項目開發中,咱們可能會常常使用系統類或別人定義好的類文件,若是發現類中並不存在咱們須要的屬性或方法,咱們不能直接修改源代碼,也不肯爲每一個對象都單獨定義相關屬性和方法,那麼不妨考慮使用原型對象對其進行擴展。 blog

 

例1:使用原型對象,擴展自定義類 繼承

 

例2:擴展數組類的功能,爲每個數組對象添加一個方法,能夠查找某個元素的所在位置 索引

var arr = [10,20,30,40,50]; ip

arr.find(30); //返回30所在數組的索引下標2

四、探究原型對象從何而來

問題:既然原型對象也是一個對象,那麼其又是由哪一個類實例化而來呢?

記住:全部的原型對象在實例化時都會自動執行如下代碼

(構造器名稱.prototype) = new Object();

因此,由以上代碼可知:全部的原型對象都是Object類的實例化,在Javascript中,Object是全部類的基類(父類)。

原型對象是由object 類的實例化來的

全部的原型對象都是由Object構造器實例化而來的,因此原型對象都會自動繼承Object類中全部屬性和方法,又因爲某個類的實例化對象(如p1對象)訪問一個不存在的屬性或方法時,系統首先到當前構造器的原型對象中去尋找,因爲原型對象又繼承了Object類,因此實例化對象也會自動繼承Object類中的全部屬性或方法,咱們把這種繼承關係就稱之爲"原型繼承"。

 

證實:原型繼承的存在

因此能夠得出結論:全部的對象(不管是系統類對象仍是自定義對象)都會自動繼承Object類中的全部屬性和方法,因此Object是全部類的基類(父類)

五、原型鏈

當Person構造器的實例化對象p1訪問一個不存在的屬性或方法時,系統會自動到Person構造器所指向的原型對象中去尋找,如找不到則會繼續向上一級構造器所指向的原型對象中去尋找,直到Object構造器所指向的原型對象,咱們把這種鏈式的查詢關係就稱之爲"原型鏈"。

若是一個person類的對象訪問一個對象中沒有的屬性,就會到person的原型對象中去尋找,若是找不到就去object的原型對象中去尋找,這就是原型鏈

證實:原型鏈的存在

相關文章
相關標籤/搜索