亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

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

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

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

2 回答

?
慕瓜9014302

TA貢獻1條經驗 獲得超0個贊

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

TA貢獻1770條經驗 獲得超3個贊

1:首先,為什么這個的constructer要指向subType?
實例化一個對象的時候,會產生一個指針屬性:_protol_,指向實例的原型對象。我們的原型對象內會產生constructor屬性,指向它的構造函數。
我們的實例能從原型對象上繼承屬性與方法。同時,我們原型對象內的constructor屬性自然也能夠繼承到。
現在來看問題中的例子:

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 和 它的構造函數是什么:

function(price,speed){    this.price = price;    this.speed = speed;
}function Function() { [native code] }

即我們下面傳入子類的構造函數,此時的子類還沒有實例化,所以它還并沒有從其原型對象上獲取到constructor屬性。
此時,
subType : 我們定義的子類函數
subType.constructor(即一個函數的構造函數): 當然就是我們的Function對象了!
那么我們的抽象工廠為了創建出這個子類實例,需要做什么呢?
也就是例子中寫的啦:

 subType.constructor = subType; subType.prototype = new F();

這樣一來,我們定義的未實例化的子類函數,通過這個抽象工廠,進行了實例化;通過subType.constructor = subType得到了本身應該有的constructror屬性,通過原型繼承到了父類的屬性和方法。
2:為什么要弄個F函數來緩存?
因為數組,對象,函數(方法),作為引用類型,它們的名稱只是指向堆內存的指針。如果直接subType.prototype = new AbstractFactory[superType]();那么我們可以通過子類去修改堆內存中的內容。進而改變父類的引用類型的值了。
緩存的話,能夠 阻止我們的子類對父類可能發生的更改。


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

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號