herodby
          技術 筆記
          posts - 14,  comments - 14,  trackbacks - 0
          ????? javascript的繼承機制并不是明確規定的,而是通過模仿實現的,意味著繼承不是由解釋程序處理,開發者有權決定最適合的繼承方式. 下面我給出幾種常用的方法:
          ???? 1 .對象冒充
          ????????? 原理: 構造函數使用this關鍵字給所有屬性和方法賦值, 因為構造函數只是一個函數,所以可以使ClassA的構造函數成為classB的方法,然后調用它.這樣classB就會收到classA的構造函數中定義的屬性和方法.例子:
          ?? function classA(name)
          ?? {
          ?????????this.name=name;
          ???????? this.showName=function(){alert(this.name);}
          ???}
          ?? function classB(name)
          ?? {
          ???????? this.newMethod = classA;
          ???????? this.newMethod(name);
          ?? }
          ???obj = new classA("hero");
          ?? objB = new classB("dby");
          ?? obj.showName(); //?? print hero
          ?? objB.showName(); // print dby? 說明classB 繼承了classA的方法.
          ?? 對象冒充可以實現多重繼承? 例如
          ?? function classz(){
          ?? this.newMethod = classX;
          ?? this.newMethod();
          ?? delete this.newMethod;
          ?? this.newMethod=classY;
          ?? this.newMethod():
          ?? delete this.newMethod;
          ? }
          ??但是如果classX和classY有相同的屬性或者方法,classY具有高優先級.
          ?? 2.call()方法
          ??? call方法使與經典的對象冒充法就相近的方法,它的第一個參數用作this的對象,其他參數都直接傳遞給函數自身.
          ??? ?? function sayName(perfix)
          ?? {
          ??alert(perfix+this.name);
          ?? }
          ?? obj= new Object();
          ?? obj.name="hero";
          ?? sayName.call(obj,"hello," );
          ?? function classA(name)
          ?? {
          ???????? this.name=name;
          ???????? this.showName=function(){alert(this.name);};
          ?? }
          ?? function classB(name)
          ?? {
          ??classA.call(this,name);
          ?? }
          ?? objB = new classB("bing");
          ?? objB.showName();////說明classB繼承classA的showName方法
          ? 3.apply()方法
          ???
          aplly()方法有2個參數,一個用作this對象,一個使傳遞給函數的參數數組.
          ?????? function sayName(perfix)
          ?? {
          ??alert(perfix+this.name);
          ?? }
          ?? obj= new Object();
          ?? obj.name="hero";
          ?? sayName.aplly(obj,new Array("hello,")?);
          ? 4. 原型鏈
          ?? prototype對象的任何屬性和方法都會被傳遞給對應類的所有實例,原型鏈就是用這種方式來顯現繼承.
          ??? function classA (){}
          ??? classA.prototype.name="hero";
          ??? classA.prototype.showName=function(){alert(this.name)}
          ??? function classB(){}
          ?? classB.prototype=new classA();
          ???objb = new classB()
          ?? objb.showName();//print hero? 說明b繼承了a的方法
          ?? 這里需要注意 調用classA的構造函數時,沒有給它傳遞參數,這是原型鏈的標準做法,確保函數的構造函數沒有任何參數.
          ?? 并且 子類的所有屬性和方法,必須出現在prototype屬性被賦值后,應為在它之前賦的值會被刪除.因為對象的prototype屬性被替換成了新對象,添加了新方法的原始對象將被銷毀.
          ??
          ?? 5 混和方式
          ?????? 就是用冒充方式 定義構造函數屬性,用原型法定義對象方法.
          ?? function classA(name)
          ?? {
          ???????? this.name=name;
          ?? }
          ?? classA.prototype.showName=function(){alert(this.name)}
          ?? function classB(name)
          ?? {
          ??classA.call(this,name);
          ?? }
          ?? classB.prototype = new classA();
          ?? classB.prototype.showName1=function(){alert(this.name+"*****");};
          ?? obj = new classB("hero");
          ?? obj.showName();
          ?? obj.showName1();
          ? 在classB的構造函數中通過調用call方法 繼承classA中的name屬性,用原型鏈來繼承classA的showName方法.
          posted on 2006-11-27 15:09 鄧兵野 閱讀(1912) 評論(1)  編輯  收藏 所屬分類: javascript

          FeedBack:
          # re: javascript 繼承實現方法
          2006-11-27 15:41 | liu
          原來JS也有類似JAVA的這樣繼承機制!  回復  更多評論
            

          <2006年11月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 镇巴县| 麻城市| 呼伦贝尔市| 阳信县| 平度市| 垣曲县| 新竹市| 荣昌县| 沧州市| 尉犁县| 东海县| 大田县| 霍山县| 安龙县| 施甸县| 天门市| 延边| 海兴县| 刚察县| 彭水| 大姚县| 巩义市| 广水市| 读书| 航空| 栖霞市| 云林县| 蒙阴县| 锦州市| 饶平县| 赤峰市| 广安市| 东至县| 安乡县| 嘉兴市| 大关县| 昌都县| 永昌县| 赤壁市| 封丘县| 钦州市|