第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

關于抽象工廠模式的一個問題

關于抽象工廠模式的一個問題

阿晨1998 2018-09-21 23:23:54
有咩有看過張容銘的javascript設計模式這一本書的?其中見到抽象工廠模式抽象工廠模式(abstract Fctory):通過對類的工廠抽象使其業(yè)務用于對產(chǎn)品類鏃的創(chuàng)建,而不負責創(chuàng)建某一類產(chǎn)品的實例.//汽車抽象類,當使用其實例對象的方法時會拋出錯誤     var Car = function(){};     Car.protorype = {        getPrice : function(){            return new Error('抽象方法不能調(diào)用!');         },        getSpeed : function(){            return new Error('抽象方法不能調(diào)用!');         }     }我們不能使用它來創(chuàng)建一個真實的對象,一般用來作為父類來創(chuàng)建一些子類抽象工廠其實是一個實現(xiàn)子類繼承父類的方法,在這個方法種我我們需要傳入子類以及要繼承父類的名稱. 過渡類的原型繼承,不是繼承父類的原型,而是通過new 復制一個父類的實例,過渡類不僅僅繼承了父類的原型方法,還繼承了父類的對象屬性. 使用方法//寶馬汽車類     var BMW = function(price,speed){        this.price = price;        this.speed = speed;     }    //抽象工廠實現(xiàn)對Car抽象類的繼承     AbstractFactory(BMW,'Car');     BMW.prototype.getPrice = function(){        return this.price;     }我的問題是:這一句//將子類constructor指向子類                subType.constructor = subType;意義何在?還有,為什么要弄個F函數(shù)來緩存?直接subType.prototype = new AbstractFactory[superType]();不是更省事嗎?很疑惑
查看完整描述

2 回答

?
慕瓜9014302

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

上面的回答是錯誤的,subType可以理解為Function實例所以他的constructor是Function。subType.constructor = subType這句應該是寫錯了因為這樣寫 后面在創(chuàng)建類實例的時候會丟失,應該在subType.prototype = new F();的后面寫subType.prototype.constructor = subType;(這個賦值完全可以省略,他的唯一作用是特殊需要的時候 取實例的constructor來確定實例是哪個類創(chuàng)建的 解決子類不是父類實例的問題) 至于第二個問題F緩存類在這里的作用是擴展 并不是防止父類引用類型值被修改。
查看完整回答
反對 回復 2020-06-26
?
德瑪西亞99

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ā)生的更改。


查看完整回答
反對 回復 2018-10-29
  • 2 回答
  • 0 關注
  • 901 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號