自知其無知
          不懂,慢慢懂。
          posts - 2,comments - 2,trackbacks - 0
          <script type="text/javascript">


          /* 創(chuàng)建對(duì)象的幾種方式: */

          // 1. 工廠方法:能創(chuàng)建并返回特定類型對(duì)象的工廠函數(shù)(factory function).
          function createCar(sColor){
              
          var car = new Object();   // 或者 var car = new Object ;
              // 對(duì)象屬性
              car.color = sColor ;      
              
          // 對(duì)象方法
              car.showColor = function (){   
                  alert(
          123);
              }
           ;    // 記住,這里一定要用 ; 表示結(jié)束
              
              
          return car;        // 這里是 return car ; 而不是 return this.car ; 因?yàn)?nbsp;this.car 為 undefined
          }

          /* 
            調(diào)用此函數(shù)時(shí),將創(chuàng)建對(duì)象,并賦予它所有必要的屬性,使用此方法創(chuàng)建 car 對(duì)象的兩個(gè)版本,
            ( oCar1 和 oCar2 ) ,他們的屬性完全一樣。
            使用此方法存在的問題:
            1. 語義上看起來不像使用帶有構(gòu)造函數(shù)的 new 運(yùn)算那么正規(guī).
            2. 使用這種方式必須創(chuàng)建對(duì)象的方法。每次調(diào)用 createCar(),都要?jiǎng)?chuàng)建 showColor(),意味著每一個(gè)對(duì)象
            都有自己的 showColor 版本,事實(shí)上,每一個(gè)對(duì)象都共享了是同一個(gè)函數(shù).
            有些開發(fā)者在工廠函數(shù)外定義對(duì)象的方法,然后通過屬性指向該方法。從而避免這個(gè)問題:
          */

          function createCar2(sColor){
              
          var car = new Object();
              car.color 
          = sColor ;
              car.showColor 
          = showColor ;

              
          return car ;
          }


          function showColor(){
              alert(
          this.color);
          }


          var oCar1 = createCar('red');
          var oCar2 = createCar('yellow');

          var oCar3 = createCar2('blue');
          var oCar4 = createCar2('black');

          /*
              注意這兩個(gè)對(duì)象(oCar3 和 oCar4 ) 調(diào)用showColor 屬性的方式,雖然美其名曰是“屬性”,其實(shí)還是方法!!!
              所以是 oCar3.showColor(); 而不是 oCar3.showColor ;
          */


          oCar3.showColor();
          oCar4.showColor();

          /*
            在這段重寫的代碼中,在函數(shù) createCar2() 前定義了函數(shù)showColor(), 在 createCar2() 內(nèi)部,賦予對(duì)象一個(gè)已經(jīng)
            指向已經(jīng)存在的 showColor() 函數(shù)的指針,從功能上講,這樣解決了重復(fù)創(chuàng)建對(duì)象的問題,但該函數(shù)看起來不像對(duì)象
            的方法。

            所有這些問題引起了開發(fā)者的定義構(gòu)造函數(shù)的出現(xiàn)
          */


          // 2. 構(gòu)造函數(shù)方式

          function Car(sColor){
              
          this.color = sColor;
              
          this.showColor = function(){
                  alert(
          this.color);
              }
          ;
          }


          var car1 = new Car('red');
          car1.showColor();

          /*
            你可能已經(jīng)注意到第一個(gè)的差別了,在構(gòu)造函數(shù)內(nèi)部無創(chuàng)建對(duì)象,而是使用 this 關(guān)鍵字,使用 new 
            運(yùn)算符調(diào)用構(gòu)造函數(shù),在執(zhí)行第一行代碼前先創(chuàng)建一個(gè)對(duì)象,只有用 this 才能訪問該對(duì)象。然后可以
            直接賦予 this 屬性,默認(rèn)情況下是構(gòu)造函數(shù)的返回值,(不必明確使用 return 運(yùn)算符)。
            這種方式在管理函數(shù)方面與工廠方法一樣都存在相同的問題.
           
          */


          // 3. 原型方式
          function PCar(){
          }


          PCar.prototype.color 
          = "blue";
          var pcar1 = new PCar();

          /*
            調(diào)用 new Car()時(shí),原型的所有屬性都被立即賦予要?jiǎng)?chuàng)建的對(duì)象,意味著所有的 PCar 實(shí)例存放的是指向
            showColor() 函數(shù)的指針,從語義看起來都屬于一個(gè)對(duì)象,因此解決了前面兩種方式存在的問題。此外使用
            該方法,還能使用 instanceof 運(yùn)算符檢查給定變量指向的對(duì)象類型。因此下面的代碼將輸出 true:
          */

          alert(pcar1 
          instanceof PCar);  // output "true"

          /*
            這個(gè)方法看起來不錯(cuò),遺憾的是,它并不盡人意。
            1. 首先這個(gè)構(gòu)造函數(shù)沒有參數(shù)。使用原型方式時(shí),不能給構(gòu)造函數(shù)傳遞參數(shù)初始化屬性值,因?yàn)?nbsp;pcar1 和
                pcar2 的屬性都等于 "blue"
            2. 真正的問題出現(xiàn)在屬性指向的對(duì)象,而不是函數(shù)時(shí),函數(shù)共享不會(huì)造成任何問題,但是對(duì)象卻是很少被多個(gè)
                實(shí)例共享的。
           
          */



           
          // 4. 混合的構(gòu)造函數(shù)/原型方式(推薦)
          /*
            聯(lián)合使用構(gòu)造函數(shù)和原型方式,就可像使用其他程序設(shè)計(jì)語言一樣創(chuàng)建對(duì)象,這種概念非常簡單,即用構(gòu)造函數(shù)
            定義對(duì)象的所有非函數(shù)屬性,用原型方式定義對(duì)象的函數(shù)屬性(方法)。
           
          */


          function hCar(sColor){
              
          this.color = sColor;    
              
          this.drivers = new Array('Mike','Sue');
          }


          hCar.prototype.showColor 
          = function(){
              alert(
          this.color);
          }


          var hcar1 = new hCar('y color');
          var hcar2 = new hCar('r color');

          hcar1.drivers.push('Matt');

          alert(hcar1.drivers);  
          // output "Mike,Sue,Matt"
          alert(hcar2.drivers);  // output "Mike,Sue"

          // 5. 動(dòng)態(tài)原型方式 (推薦)
          /*
            對(duì)于習(xí)慣使用其他開發(fā)語言的開發(fā)者來說,使用混合構(gòu)造函數(shù)/原型方式感覺不那么和諧。批評(píng)構(gòu)造函數(shù)/原型方式的人
            認(rèn)為,在構(gòu)造函數(shù)內(nèi)找屬性,在外部找方法的做法不合理。所以他們?cè)O(shè)計(jì)了動(dòng)態(tài)原型方式,以供更友好的編碼風(fēng)格。

            動(dòng)態(tài)原型方式的基本想法與混合構(gòu)造函數(shù)/原型方式 相同,即在構(gòu)造函數(shù)內(nèi)定義非函數(shù)的屬性,而函數(shù)的屬性則利用
            原型屬性定義。唯一的區(qū)別是賦予對(duì)象方法的位置。下面是使用動(dòng)態(tài)原型方法重寫的 Car 類:
          */


          function DCar(sColor){
              
          this.color = sColor;
              
          this.drivers = new Array('Mike','Sue');
              
              
          if(typeof DCar._initialized == 'undefined'){
                  
                  DCar.prototype.showColor 
          = function(){
                      alert(
          this.color);
                  }

              }


              DCar._initialized 
          = true;
          }



          var dcar1 = new DCar('y dcar');
          var dcar2 = new DCar('b dcar');

          dcar1.showColor();
          dcar2.showColor();



          alert(DCar._initialized);    
          // output "true"
          alert(dcar1._initialized);  // output "undefined"

          </script>
          posted on 2008-12-05 11:45 CopyHoo 閱讀(3497) 評(píng)論(0)  編輯  收藏 所屬分類: JavaScript
          主站蜘蛛池模板: 嘉峪关市| 资源县| 桃源县| 上高县| 白城市| 广宗县| 江永县| 平谷区| 安西县| 稷山县| 宣城市| 龙里县| 皋兰县| 吉安县| 金山区| 修水县| 法库县| 金湖县| 阿拉善右旗| 庆阳市| 信宜市| 东平县| 巴里| 遂宁市| 德州市| 呼和浩特市| 嘉兴市| 肃北| 南宁市| 芜湖县| 修文县| 义马市| 乐安县| 镇康县| 垣曲县| 蛟河市| 顺昌县| 日照市| 肇庆市| 普宁市| 浦县|