google closure--繼承模塊二:goog.base()demo分析
昨天已經講到了goog.inherits(),主要負責通過為子構造函數原型對象通過原型鏈繼承父構造函數的原型對象的方法,完成繼承。這樣繼承只完成了原型對象的繼承,看看之前的那張圖:

是不是感覺父構造函數好像沒什么用處啊,還記得上篇文章,構建一個超級對象的設想嗎?這個要依賴另一個API,goog.base().
在看源代碼之前讓我們看看一個簡單的demo,溫習一下goog.inherit(),這個demo還可以幫助我們了解goog.base()可以做些什么。
demo代碼:

輸出結果:

分析:
先把goog.inherit()和goog.base()放在一邊,讓我們先分析一下這三個構造函數:A,B,C。
A:
構造函數:為new(構造)出來的新對象添加name屬性,并取名周杰倫。
原型對象:添加details方法,并在控制臺輸出調用該方法的對象的name的老婆是昆凌。
(不排除有人使用call,apply等方法冒充周杰倫。。。)
B:
構造函數:為new(構造)出來的新對象添加age屬性,并賦值為24。
原型對象:添加details方法,并在控制臺輸出,調用該方法的對象的name屬性的值的是一名歌手,年齡為該對象屬性age的值。
這里有個疑問:該構造函數創建出來的對象是不足以執行其原型對象的方法,簡而言之,如果我們用B構造函數創建一個對象,這個對象是沒有name屬性,如果后面不給該對象添加name屬性,而去調用details的方法,在該對象中找不到name屬性從而產生錯誤。
C:
構造函數:為new(構造)出來的新對象添加height屬性,并復制為“173cm”。
原型對象:details方法,輸出調用該方法的對象的媽媽是葉惠美,身高為該對象的height屬性值。
這里與B相似,通過C構造函數構造出來的對象也是不足以滿足其原型對象的details的方法,因為C構造出來的對象沒有name屬性。
然后讓我們分析一下結果:

person對象是通過A構造函數構造出來的,但是存在下列疑惑:
1.Person對象為什么同時擁有,B構造函數,和C構造函數中為新對象添加的屬性?
2.為什么調用Person對象的details方法的時候不僅執行了構造函數A原型對象的details方法,同時還執行了B和C的原型對象的同名方法?
這就是goog.base的威力。
goog.base()主要有2種使用情況:
1.在構造函數中使用,比如:

先看作用:
找到A繼承的父構造函數B,并將當前作用域對象傳入B構造函數,并調用。這就可以解釋疑惑1中Person對象擁有B構造函數構建的age屬性,同時B中又將A中的作用域對象(Person)傳入并調用了其父構造函數C,所以person對象又有了height屬性。
2.在構造函數原型對象的方法中使用,比如:

在這里,goog.base()的第二個參數是需要調用該原型對象constructor指向的構造函數繼承的父構造函數的原型對象的方法名,所以這就很好的解釋了疑惑2,為什么執行了B原型對象,同時在B中又調用goog.base()所以又執行了C原型對象的details方法。
這一章我們主要是,做了一個簡單的demo,并分析了goog.base()的兩個主要用途,及其效果,下面一章我們將著重分析goog.base()的源碼。
浙公網安備 33010602011771號