爪哇之家

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            35 隨筆 :: 29 文章 :: 8 評論 :: 0 Trackbacks
          5? 自定義類和對象

          5.1? 工廠方法

          ??? 在ECMAScript中創建工廠方法,返回一個特定類型的對象,以此實現代碼的簡潔適用。

          function?createFruit()?{
          ??
          var?tempFruit?=?new?Object;
          ??tempFruit.name?
          =?"apple";
          ??tempFruit.number?
          =?5;
          ??tempFruit.showName?
          =?function()?{
          ????alert(
          this.name);
          ??}
          ;
          return?tempFruit;
          }


          var?Fruit1?=?creatFruit();
          var?Fruit2?=?creatFruit();

          ??? 在createFruit()中可以加入形參來傳入參數的值。隨著ECMAScript不斷被規范化,這種創建對象的方法已不再流行,一部分原因是語法上 的,一部分原因是功能上的,如每個對象的實例都擁有屬于自己的showName方法,給內存管理帶來一定的開銷。

          5.2? 構造函數

          ??? 選擇一個類名,第一個字母大寫,該類名即是構造函數的名稱。創建一個構造函數和工廠方法比較類似,不同的是需要使用關鍵字new來創建對象的引用。使用構造函數的方式來創建對象和使用工廠方法有著相同的弊端。

          function?Fruit(name,?number)?{
          ??
          this.name?=?name;
          ??
          this.number?=?number;
          ??
          this.showName?=?function()?{
          ????alert(
          this.name);
          ??}
          ;
          }


          var?Fruit1?=?new?Fruit("apple",?5);
          var?Fruit2?=?new?Fruit("pear",?3);

          5.3? 使用 Prototype

          ??? 使用prototype屬性可以用來創建新的對象,首先需要一個空的構造函數建立類的名稱,然后所有的屬性和方法都直接分配到prototype屬性中。

          function?Fruit()?{
          }

          Fruit.prototype.name?
          =?"apple";
          Fruit.prototype.number?
          =?5;
          Fruit.prototype.showName?
          =?function()?{
          ??alert(
          this.name);
          }
          ;

          var?fruit1?=?new?Fruit();
          var?fruit2?=?new?Fruit();

          ??? 但是,這樣同樣存在一些缺點。首先,構造函數中沒有參數,給初始化帶來一些麻煩,其次,當一個屬性指向的是一個對象而非方法時,該對象會被所有的實例所共享,任何一點改動都會影響到其他對象引用的使用。

          5.4? 混合使用工廠方法和Prototype

          這個概念很簡單:使用構造函數定義所有除方法外的屬性,使用 prototype 定義對象的方法。這樣每個方法只會被創建一次,每個對象都能擁有自己對象實例的屬性。

          function?Fruit(name,?number)?{
          ??
          this.name?=?name;
          ??
          this.number?=?number;
          ??
          this.owner?=?new?Array("Jerry",?"Terry");
          }

          Fruit.prototype.showName?
          =?function()?{
          ??alert(
          this.name);
          }
          ;

          var?Fruit1?=?new?Fruit("apple",?5);
          var?Fruit2?=?new?Fruit("pear",?3);

          5.5? 動態 prototype

          ??? 簡單來說,這種方法就是使用了一個標識符來判斷 prototype 是否已經被指向某個方法,從而保證這些方法只會被創建并指向一次。

          5.6? 混合工廠方法

          ??? 這種方法和經典的工廠方法及構造函數方法在對象方法內存管理上存在同樣的問題,一般不建議使用該方法,除了某些特殊情況(XML in JavaScript中有這樣的例子)。

          6? 修改對象

          ??? 使用prototype對象可以對對象進行修改。除了用戶自定義的對象外,ECMAScript原始對象也有prototype屬性。直接使用 prototype可以給對象創建新的方法。

          Number.prototype.toHexString?=?function()?{
          ??
          return?this.toString(16);
          }
          ;
          var?iNum?=?10;
          alert(iNum.toHexString());??
          //輸出A

          ??? 另外,使用prototype可以輕松修改已有的方法,讓方法名指向新的方法。需要注意的是,指向新的方法后,原有的方法不再被任何對象使用,將會被垃圾 回收器銷毀,使得原有方法不再存在。比較安全的解決辦法是,建立一個新的引用來保存原有的方法,然后再將原方法覆蓋。

          ??? 比較特殊的是,ECMAScript中創建對象,在對象引用被創建后,可以給對象加入新的方法,并且可以立即在對象的引用中使用。這是 ECMAScript的一個特性,但不推薦這樣使用,以免帶來不必要的麻煩,例如閱讀理解、文檔資料等。
          posted on 2006-07-16 13:28 爪哇之家 閱讀(164) 評論(0)  編輯  收藏 所屬分類: javascript
          主站蜘蛛池模板: 略阳县| 和平县| 津市市| 修武县| 高平市| 鹰潭市| 定远县| 弥勒县| 南平市| 纳雍县| 无极县| 伊宁县| 南雄市| 花垣县| 库车县| 嘉峪关市| 丰县| 昌乐县| 江西省| 富裕县| 乌拉特中旗| 车致| 榆林市| 资阳市| 荣成市| 嘉祥县| 吐鲁番市| 巴塘县| 白城市| 锡林浩特市| 托里县| 株洲县| 金山区| 广河县| 霞浦县| 中江县| 外汇| 怀宁县| 陆良县| 陕西省| 磐石市|