鐵桿的面向?qū)ο笤O(shè)計(jì)支持者會(huì)注意到,當(dāng)使用prototype方法向JavaScript對象增加屬性和函數(shù)時(shí),所增加的屬性和函數(shù)都是公用的,所有其他對象都能訪問。對于函數(shù)來說,這通常沒有問題,因?yàn)榇蠖鄶?shù)函數(shù)都確實(shí)應(yīng)當(dāng)提供給外部客戶。但是對于屬性,面向?qū)ο笤O(shè)計(jì)的支持者就會(huì)指出,公有屬性違反了信息隱藏的概念,對象的屬性應(yīng)當(dāng)是私有的,因此外部客戶不能直接訪問。外部客戶只能通過公用可用的函數(shù)來訪問對象的私有屬性。
對于JavaScript,同樣有可能創(chuàng)建外部客戶不能訪問的私有屬性,而只能通過對象的(公用)方法來訪問,但這一點(diǎn)很少有人知道。Douglas Crockford[3]提出了一種在JavaScript中創(chuàng)建私有屬性的方法。這種方法非常簡單,總結(jié)如下:
l 私有屬性可以在構(gòu)造函數(shù)中使用var關(guān)鍵字定義。
l 私有屬性只能由特權(quán)函數(shù)(privileged function)公用訪問。特權(quán)函數(shù)就是在構(gòu)造函數(shù)中使用this關(guān)鍵字定義的函數(shù)。外部客戶可以訪問特權(quán)函數(shù),而且特權(quán)函數(shù)可以訪問對象的私有屬性。
下面來考慮前一個(gè)示例中的Vehicle類。假設(shè)你想讓wheelCount和curbWeightIn- Pounds屬性是私有的,并只能通過公用方法訪問。新的Vehicle對象如代碼清單5-4所示。
代碼清單5-4 重寫后的Vehicle對象
注意,wheelCount和curbWeightInPounds屬性都在構(gòu)造函數(shù)中使用var關(guān)鍵字定義,這就使得這兩個(gè)屬性是私有屬性。屬性不再是公用的,如果想通過點(diǎn)記法訪問wheelCount屬性的值,如下:
var numberOfWheels = vehicle.wheelCount;
就會(huì)返回undefined,而不是wheelCount實(shí)際的值。
由于屬性現(xiàn)在是私有的,因此需要提供能訪問這些屬性的公用函數(shù)。getWheelCount、setWheelCount、getCurbWeightInPounds和setCurbWeightInPounds函數(shù)就是作此使用的。現(xiàn)在Vehicle對象可以保證只能通過公用函數(shù)訪問私有屬性,因此滿足了信息隱藏的
引用:http://book.csdn.net/bookfiles/11/100117056.shtml
Powered by: BlogJava Copyright © 沙漠中的魚