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

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

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

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 崇礼县| 陆河县| 莎车县| 庆安县| 黔江区| 长丰县| 揭东县| 扶风县| 五原县| 万全县| 乾安县| 潜江市| 天柱县| 麻江县| 天等县| 通山县| 密山市| 曲沃县| 买车| 平武县| 呼玛县| 布尔津县| 大港区| 绿春县| 商都县| 资中县| 塔河县| 平远县| 若羌县| 鸡西市| 岳阳市| 秦皇岛市| 海南省| 南宫市| 商河县| 铜鼓县| 昌宁县| 卓尼县| 曲周县| 罗城| 天津市|