The NoteBook of EricKong

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

          原理:

          構造函數使用this關鍵字給所有屬性和方法賦值.因為構造函數只是一個函數,所以可使ClassA的構造方法稱為ClassB的方法,然后調用它.

          ClassB就會收到ClassA的構造方法中定義的屬性和方法.

          例子:

                  function ClassA(name){             this.name=name;             this.getName=function(){                 return this.name;             }         }                  function ClassB(name,password){             this.ClassA=ClassA;             this.ClassA(name);             delete this.ClassA;                          this.password=password;             this.getPassword=function(){                 return this.password;             }         }                  var b =new ClassB('wwww','1123');         document.write(b.getName());

          經過調試,我們可以看到:

          image

          變量b中已經包含了ClassA中定義的方法.

          代碼理解:

          在ClassB中,this.ClassA(name)等價于以下代碼:
                      this.name=name;
                      this.getName=function(){
                          return this.name;
                      }

          即:將ClassA函數中的代碼復制過來,即:ClassB中的代碼如下:

                  function ClassB(name,password){             this.ClassA=ClassA;                          this.name=name;             this.getName=function(){                 return this.name;             }                          delete this.ClassA;                          this.password=password;             this.getPassword=function(){                 return this.password;             }         }

          然后通過delete this.ClassA之后,ClassB中的實際代碼如下:

                  function ClassB(name,password){             this.name=name;             this.getName=function(){                 return this.name;             }                          this.password=password;             this.getPassword=function(){                 return this.password;             }         }

          從而實現了對象冒充.

          注意:

          對象冒充可以支持多重繼承,也就是說一個類可以繼承多個類.例子如下:

                  function ClassC(){             this.ClassX=ClassX;             this.ClassX();             delete this.ClassX;                          this.ClassY=ClassY;             this.ClassY();             delete this.ClassY;         }

          這樣就ClassC就實現了繼承自ClassX,ClassY.但此處存在一個弊端:

          若ClassX和ClassY中存在兩個同名的變量或方法,則ClassY會覆蓋ClassX中的變量或方法.

          此外:

          我們還可以通過call()和apply()方法實現對象冒充.

          對于call方法:

          它的第一個參數用做this的對象,其他參數都直接傳遞給函數自身.我們來看下面這個小例子:

                  function ShowColor(param1,param2){             this.getColor=function(){                 document.write(this.color+"<br/>Two Params : "+param1+" ; "+param2);             }         }                  var obj = new Object;         obj.color='Red';         ShowColor.call(obj,"pm1",'pm2');                  obj.getColor();

          運行此段代碼后,我們發現頁面上顯示為:

          image

          解釋:

          ShowColor方法是在對象外定義的,調用call時,它將第一個參數,也就是將ClassA的this指向了obj,將后面的參數"pm1"傳遞給了param1,'pm2'傳遞給了param2.

                  var obj = new Object;         obj.color='Red';         ShowColor.call(obj,"pm1",'pm2');

          也就實現了以下效果:

          我們將上面代碼中的obj.color='Red'給注釋起來,再運行代碼,結果如下:

          image

          原因是obj并沒有color屬性,而obj.getColor()方法中需要this.color,即obj.color,所以會出現undefined的結果.

          我們再來看如何利用call來實現對象冒充,繼續以剛才的ClassA,ClassB為例:

                  function ClassA(name){             this.name=name;             this.getName=function(){                 return this.name;             }                     }                  function ClassB(name,password){             //this.ClassA=ClassA;             //this.ClassA(name);             //delete this.ClassA;             ClassA.call(this,name);                          this.password=password;             this.getPassword=function(){                 return this.password;             }         }         var b = new ClassB('www','111');         b.getPassword();

          調試效果:

          image

          解釋:

          此處的ClassA.call(this,name); 即將ClassA的this指向了ClassB的this.從而實現了對象冒充.

          現在,我們再來看apply方法.

          apply方法有兩個參數,用作this的對象和要傳傳遞給函數的參數的數組.

          例子:

                  function ShowColor(param1,param2){             this.getColor=function(){                 document.write(this.color+"<br/>Two Params : "+param1+" ; "+param2);             }         }                  var obj = new Object;         obj.color='Red';         ShowColor.apply(obj,new Array("pm1",'pm2'));                  obj.getColor();

          此方法可以被用于對象冒充:

                  function ClassA(name){             this.name=name;             this.getName=function(){                 return this.name;             }                     }                  function ClassB(name,password){             //this.ClassA=ClassA;             //this.ClassA(name);             //delete this.ClassA;             ClassA.apply(this,new Array(name));                          this.password=password;             this.getPassword=function(){                 return this.password;             }         }                  var b = new ClassB('www','111');         b.getPassword();

          調試效果:

          image

          原型繼承

          Javascript對象的創建和繼承使用了一套特別的模式,稱作原型式繼承.

          原理是:對象的構造函數可以從其他對象中繼承方法,它創建出一個原型對象后,所有其他的新對象都可以基于這個原型對象來構建.

          原型本身并不會從其他原型或者構造函數中繼承屬性,而屬性都是從實際對象那里繼承過來的.

          例1:

                  function Person(name){             this.name=name;         }                  Person.prototype.GetName=function(){             return this.name;         }                  function User(name,password){             this.name = name;             this.password = password;         }                  User.prototype = new Person();         User.prototype.GetPassword=function(){             return this.password;         }

          解釋:

          User.prototype = new Person();這句話如何理解呢?User是對User對象構造函數的引用,new Person()使用person構造函數創建了一個Person對象,然后把Person對象的原型置為這個操作的結果.也就是說,當每次new User()時,得到的新User對象都會帶有Person對象的所有方法.

          posted on 2012-12-25 11:03 Eric_jiang 閱讀(424) 評論(0)  編輯  收藏 所屬分類: JavaScript
          主站蜘蛛池模板: 安多县| 昭觉县| 新乡县| 东阳市| 平塘县| 龙陵县| 喀什市| 资兴市| 留坝县| 维西| 柳州市| 漯河市| 江阴市| 大荔县| 吉木乃县| 肥东县| 淮南市| 双鸭山市| 丰镇市| 曲阜市| 丁青县| 宜昌市| 隆回县| 三都| 辉县市| 巩留县| 中江县| 望江县| 琼中| 邵阳县| 崇州市| 阜南县| 玉林市| 台南市| 长丰县| 太湖县| 河南省| 饶平县| 秭归县| 广州市| 保康县|