沙漠中的魚(yú)

          欲上天堂,先下地獄
          posts - 0, comments - 56, trackbacks - 0, articles - 119
            BlogJava :: 首頁(yè) ::  :: 聯(lián)系 :: 聚合  :: 管理

                  鐵桿的面向?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ì)象

          function Vehicle() {

              
          var wheelCount = 4;

              
          var curbWeightInPounds = 4000;

              
          this.getWheelCount = function() {
                  
          return wheelCount;
              }


              
          this.setWheelCount = function(count) {
                  wheelCount 
          = count;
              }


              
          this.getCurbWeightInPounds = function() {
                  
          return curbWeightInPounds;
              }


              
          this.setCurbWeightInPounds = function(weight) {
                  curbWeightInPounds 
          = weight;
              }


              
          this.refuel = function() {
                  
          return "Refueling Vehicle with regular 87 octane gasoline";
              }


              
          this.mainTasks = function() {
                  
          return "Driving to work, school, and the grocery store";
              }

          }

           

          注意,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

          主站蜘蛛池模板: 鄂托克旗| 石狮市| 莒南县| 若尔盖县| 东兰县| 林周县| 雅安市| 江陵县| 澳门| 红桥区| 云龙县| 西乌| 赤峰市| 云安县| 宾川县| 延川县| 和静县| 永康市| 巨野县| 南昌县| 四会市| 万州区| 梓潼县| 崇仁县| 霍邱县| 开化县| 侯马市| 高雄市| 仪陇县| 台州市| 九龙县| 庆安县| 宁明县| 原平市| 广元市| 宜兰市| 津南区| 调兵山市| 社旗县| 白水县| 沙湾县|