2 回答

TA貢獻1條經(jīng)驗 獲得超0個贊

TA貢獻1770條經(jīng)驗 獲得超3個贊
1:首先,為什么這個的constructer要指向subType?
實例化一個對象的時候,會產(chǎn)生一個指針屬性:_protol_,指向?qū)嵗脑蛯ο?。我們的原型對象?nèi)會產(chǎn)生constructor屬性,指向它的構造函數(shù)。
我們的實例能從原型對象上繼承屬性與方法。同時,我們原型對象內(nèi)的constructor屬性自然也能夠繼承到。
現(xiàn)在來看問題中的例子:
if(typeof(AbstractFac[superType]) == 'function'){ function F(){} F.prototype = new AbstractFac[superType](); console.log(subType); console.log(subType.constructor); }else{ throw new Error('null'); }
在重新指定constructor和進行繼承前來看看 傳入的subType 和 它的構造函數(shù)是什么:
function(price,speed){ this.price = price; this.speed = speed; }function Function() { [native code] }
即我們下面?zhèn)魅胱宇惖臉嬙旌瘮?shù),此時的子類還沒有實例化,所以它還并沒有從其原型對象上獲取到constructor屬性。
此時,
subType : 我們定義的子類函數(shù)
subType.constructor(即一個函數(shù)的構造函數(shù)): 當然就是我們的Function對象了!
那么我們的抽象工廠為了創(chuàng)建出這個子類實例,需要做什么呢?
也就是例子中寫的啦:
subType.constructor = subType; subType.prototype = new F();
這樣一來,我們定義的未實例化的子類函數(shù),通過這個抽象工廠,進行了實例化;通過subType.constructor = subType得到了本身應該有的constructror屬性,通過原型繼承到了父類的屬性和方法。
2:為什么要弄個F函數(shù)來緩存?
因為數(shù)組,對象,函數(shù)(方法),作為引用類型,它們的名稱只是指向堆內(nèi)存的指針。如果直接subType.prototype = new AbstractFactory[superType]();那么我們可以通過子類去修改堆內(nèi)存中的內(nèi)容。進而改變父類的引用類型的值了。
緩存的話,能夠 阻止我們的子類對父類可能發(fā)生的更改。
添加回答
舉報