javaScript工廠方式原始的方式
因為對象的屬性可以在對象創建後動態定義,這在 JavaScript 最初引入時都會編寫類似下面的代碼
複製代碼 代碼如下:
var oCar = new Object;
r = "blue";
s = 4;
= 25;
Color = function() {
alert(r);
};
在上面的代碼中,創建對象 car。然後給它設置幾個屬性:它的顏色是藍色,有四個門,每加侖油可以跑 25 英里。最後一個屬性實際上是指向函數的指針,意味着該屬性是個方法。執行這段代碼後,就可以使用對象 car。不過這裏有一個問題,就是可能需要創建多個 car 的實例,這顯然不是很好的方式。
解決方案:工廠方法
要解決該問題,開發者創造了能創建並返回特定類型的對象的工廠函數。例如,函數 createCar() 可用於封裝前面列出的創建 car 對象的操作:
複製代碼 代碼如下:
function createCar(sColor,iDoors,iMpg) {
var oTempCar = new Object;
r = sColor;
s = iDoors;
= iMpg;
Color = function() {
alert(r);
};
return oTempCar;
}
var oCar1 = createCar("red",4,23);
var oCar2 = createCar("blue",3,25);
Color(); //輸出 "red"
Color(); //輸出 "blue"
調用此工廠函數,將創建新對象,並賦予它所有必要的屬性,給 createCar() 函數加上參數,即可為要創建的 car 對象的 color、doors 和 mpg 屬性賦值。這使兩個對象具有相同的屬性,卻有不同的屬性值。該方法有個不好的地方在於每創建一個car對象(即調用一次createCar函數)都會重複的為每個對象創建showColor 方法,而這時沒有必要的'而事實上,每個對象都共享同一個函數。於是我們嘗試在函數之外去聲明其方法屬性。
在工廠函數外定義對象的方法
有些開發者在工廠函數外定義對象的方法,然後通過屬性指向該方法,從而避免這個問題:
複製代碼 代碼如下:
function showColor() {
alert(r);
}
function createCar(sColor,iDoors,iMpg) {
var oTempCar = new Object;
r = sColor;
s = iDoors;
= iMpg;
Color = showColor;
return oTempCar;
}
var oCar1 = createCar("red",4,23);
var oCar2 = createCar("blue",3,25);
Color(); //輸出 "red"
Color(); //輸出 "blue"
在上面這段重寫的代碼中,在函數 createCar() 之前定義了函數 showColor()。在 createCar() 內部,賦予對象一個指向已經存在的 showColor() 函數的指針。從功能上講,這樣解決了重複創建函數對象的問題;但是從語義上講,該函數不太像是對象的方法。
-
如何理解Javascript的caller,callee,call,apply區別
在提到上述的概念之前,首先想説説javascript中函數的隱含參數:argumentsarguments該對象代表正在執行的函數和調用它的函數的參數。[function.]arguments[n]參數function:選項。當前正在執行的Function對象的名字。n:選項。要傳遞給Function對象的從0開始的參數值...
-
php項目經理的職責表述7篇
php項目經理的職責表述11、負責售前技術支持。配合銷售人員作售前產品技術講解、演示;2、根據客户需求反饋研發,提供良好解決方案3、遠程現場技術支持4、網絡環境搭建和服務器配置;5、車載產品安裝調試;6、軟件平台安裝調試;7、負責區域售後技術支持;8、參與項...
-
javascript包裝對象的用法
js對象是一種複合值:它是屬性或已命名值得集合。參考以下代碼:vars="helloworld";varlen=th;在該例子中,s是字符串,而字符串不是對象,但為何會有屬性呢?其實只要引用了字符串s的屬性,js就會將字符串通過調用newString(s)的方式轉換為對象,該對象繼承了字符串的方法,並被...
-
如何理解Javascript的caller,callee,call,apply區別
在提到上述的概念之前,首先想説説javascript中函數的隱含參數:argumentsarguments該對象代表正在執行的函數和調用它的函數的參數。[function.]arguments[n]參數function:選項。當前正在執行的Function對象的名字。n:選項。要傳遞給Function對象的從0開始的參數值...