JavaScript私有屬性和使用JavaScript的信息隱藏
Posted on 2008-04-24 14:04 沙漠中的魚(yú) 閱讀(336) 評(píng)論(0) 編輯 收藏 所屬分類: javascript鐵桿的面向?qū)ο笤O(shè)計(jì)支持者會(huì)注意到,當(dāng)使用prototype方法向JavaScript對(duì)象增加屬性和函數(shù)時(shí),所增加的屬性和函數(shù)都是公用的,所有其他對(duì)象都能訪問(wèn)。對(duì)于函數(shù)來(lái)說(shuō),這通常沒(méi)有問(wèn)題,因?yàn)榇蠖鄶?shù)函數(shù)都確實(shí)應(yīng)當(dāng)提供給外部客戶。但是對(duì)于屬性,面向?qū)ο笤O(shè)計(jì)的支持者就會(huì)指出,公有屬性違反了信息隱藏的概念,對(duì)象的屬性應(yīng)當(dāng)是私有的,因此外部客戶不能直接訪問(wèn)。外部客戶只能通過(guò)公用可用的函數(shù)來(lái)訪問(wèn)對(duì)象的私有屬性。
對(duì)于JavaScript,同樣有可能創(chuàng)建外部客戶不能訪問(wèn)的私有屬性,而只能通過(guò)對(duì)象的(公用)方法來(lái)訪問(wèn),但這一點(diǎn)很少有人知道。Douglas Crockford[3]提出了一種在JavaScript中創(chuàng)建私有屬性的方法。這種方法非常簡(jiǎn)單,總結(jié)如下:
l 私有屬性可以在構(gòu)造函數(shù)中使用var關(guān)鍵字定義。
l 私有屬性只能由特權(quán)函數(shù)(privileged function)公用訪問(wèn)。特權(quán)函數(shù)就是在構(gòu)造函數(shù)中使用this關(guān)鍵字定義的函數(shù)。外部客戶可以訪問(wèn)特權(quán)函數(shù),而且特權(quán)函數(shù)可以訪問(wèn)對(duì)象的私有屬性。
下面來(lái)考慮前一個(gè)示例中的Vehicle類。假設(shè)你想讓wheelCount和curbWeightIn- Pounds屬性是私有的,并只能通過(guò)公用方法訪問(wèn)。新的Vehicle對(duì)象如代碼清單5-4所示。
代碼清單5-4 重寫(xiě)后的Vehicle對(duì)象






























注意,wheelCount和curbWeightInPounds屬性都在構(gòu)造函數(shù)中使用var關(guān)鍵字定義,這就使得這兩個(gè)屬性是私有屬性。屬性不再是公用的,如果想通過(guò)點(diǎn)記法訪問(wèn)wheelCount屬性的值,如下:
var numberOfWheels = vehicle.wheelCount;
就會(huì)返回undefined,而不是wheelCount實(shí)際的值。
由于屬性現(xiàn)在是私有的,因此需要提供能訪問(wèn)這些屬性的公用函數(shù)。getWheelCount、setWheelCount、getCurbWeightInPounds和setCurbWeightInPounds函數(shù)就是作此使用的。現(xiàn)在Vehicle對(duì)象可以保證只能通過(guò)公用函數(shù)訪問(wèn)私有屬性,因此滿足了信息隱藏的
引用:http://book.csdn.net/bookfiles/11/100117056.shtml