<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    乖,別哭的薄殼
    ~一份耕耘,一份收獲~
    posts - 23,comments - 260,trackbacks - 0

    一、繼承的方式
    1.對象冒充
    function ClassA(sColor) {
        this.color = sColor;
        this.sayColor = function () {
            alert(this.color);
        };
    }

    function ClassB(sColor, sName) {
        this.newMethod = ClassA;
        this.newMethod(sColor);
        delete this.newMethod;
       
        this.name = sName;
        this.sayName = function () {
            alert(this.name);
        };   
    }

    var objA = new ClassA("red");
    var objB = new ClassB("blue", "Nicholas");
    objA.sayColor();
    objB.sayColor();
    objB.sayName();
    所有新的屬性和新的方法都必須在刪除了新方法的代碼行后定義。否則,可能會覆蓋超類的相關(guān)屬性和方法。
    對象冒充可以支持多繼承。
    function ClassZ(){
       this.newMethod = ClassX;
       this.newMethod(sColor);
       delete this.newMethod;

       this.newMethod = ClassY;
       this.newMethod(sColor);
       delete this.newMethod;
    }
    這里存在一個弊端,如果ClassX和ClassY具有相同的屬性或方法,ClassY具有高優(yōu)先級,因為繼承的是最后的類。

    2.call()方法
    call()方法是與經(jīng)典的對象冒充方法最相似的方法,它的第一個參數(shù)用作this的對象,其他參數(shù)都直接傳遞函數(shù)自身。
    function ClassA(sColor) {
        this.color = sColor;
        this.sayColor = function () {
            alert(this.color);
        };
    }

    function ClassB(sColor, sName) {
        //this.newMethod = ClassA;
        //this.newMethod(color);
        //delete this.newMethod;
        ClassA.call(this, sColor);

        this.name = sName;
        this.sayName = function () {
            alert(this.name);
        };
    }

    var objA = new ClassA("red");
    var objB = new ClassB("blue", "Nicholas");
    objA.sayColor();
    objB.sayColor();
    objB.sayName();

    3.apply()方法
    apply()方法有兩個參數(shù),用作this的對象和要傳遞參數(shù)的數(shù)組。例如:
    function ClassA(sColor) {
        this.color = sColor;
        this.sayColor = function () {
            alert(this.color);
        };
    }

    function ClassB(sColor, sName) {
        //this.newMethod = ClassA;
        //this.newMethod(color);
        //delete this.newMethod;
        ClassA.apply(this, arguments);

        this.name = sName;
        this.sayName = function () {
            alert(this.name);
        };
    }

    var objA = new ClassA("red");
    var objB = new ClassB("blue", "Nicholas");
    objA.sayColor();
    objB.sayColor();
    objB.sayName();

    當(dāng)然,只有超類中的參數(shù)順序與子類中的參數(shù)順序完全一致時才可以傳遞參數(shù)對象。如果不是,就必須創(chuàng)建一個單獨(dú)的數(shù)組,按照正確的順序放置參數(shù)。此外,還可以使用call()方法。

    4.原型鏈
    function ClassA() {
    }

    ClassA.prototype.color = "red";
    ClassA.prototype.sayColor = function () {
        alert(this.color);
    };

    function ClassB() {
    }

    ClassB.prototype = new ClassA();

    ClassB.prototype.name = "";
    ClassB.prototype.sayName = function () {
        alert(this.name);
    };

    var objA = new ClassA();
    var objB = new ClassB();
    objA.color = "red";
    objB.color = "blue";
    objB.name = "Nicholas";
    objA.sayColor();
    objB.sayColor();
    objB.sayName();
    注意,調(diào)用ClassA的構(gòu)造函數(shù)時,沒有給它傳遞參數(shù)。這在原型鏈中是標(biāo)準(zhǔn)做法。要確保構(gòu)造函數(shù)沒有任何參數(shù)。
    原型鏈的弊端是不支持多重繼承。

    5.混合方式
    與創(chuàng)建對象最好方式相似,用對象冒充繼承構(gòu)造函數(shù)的屬性,用原型鏈繼承prototype對象的方法。
    function ClassA(sColor) {
        this.color = sColor;
    }

    ClassA.prototype.sayColor = function () {
        alert(this.color);
    };

    function ClassB(sColor, sName) {
        ClassA.call(this, sColor);
        this.name = sName;
    }

    ClassB.prototype = new ClassA();

    ClassB.prototype.sayName = function () {
        alert(this.name);
    };


    var objA = new ClassA("red");
    var objB = new ClassB("blue", "Nicholas");
    objA.sayColor();
    objB.sayColor();
    objB.sayName();


    二、其他繼承方式
    1.zlnherit庫
    可以從http://www.nczonline.net/downloads處下載
    zInherit庫給Object類添加了兩個方法,inheritFrom()和instanceOf()
    ClassB.prototype.inheritFrom(ClassA);
    CalssB.instanceOf(ClassA);

    2.xbObjects庫
    可以從         這里,子類和超類名都以字符串形式傳進(jìn)來,而不是指向它們的構(gòu)造函數(shù)的指針。這個調(diào)用必須放在指定子類的構(gòu)造構(gòu)函數(shù)前。
    第二步,在構(gòu)造函數(shù)內(nèi)調(diào)用defineClass()方法,傳給它類名及被Clary稱為原型函數(shù)的指針,該函數(shù)用于初始化對象的所有屬性和方法。

    _classes.registerClass("ClassA");
    function ClassA(color){
       _classes.defineClass("ClassA",prototypeFunction);

       function prototypeFunction(){
          //...
       }
    }
    第三步,為該類創(chuàng)建init()方法。該方法負(fù)責(zé)設(shè)置該類的所有屬性,它必須接受與構(gòu)造函數(shù)相同的參數(shù)。作為一種規(guī)約,init()方法總是在defineClass()方法后調(diào)用。
    _classes.registerClass("ClassA");
    function ClassA(color){
       _classes.defineClass("ClassA",prototypeFunction);
       this.init(sColor);
       function prototypeFunction(){
         ClassA.prototype.init = function(sColor){
             this.parentMethod("init");
             this.color = sColor;
          }
       }
    }
    第四步,在原型函數(shù)內(nèi)添加其他類的方法。
    _classes.registerClass("ClassA");
    function ClassA(color){
       _classes.defineClass("ClassA",prototypeFunction);
       this.init(sColor);
       function prototypeFunction(){
         ClassA.prototype.init = function(sColor){
             this.parentMethod("init");
             this.color = sColor;
          }
          ClassA.prototype.sayColor = function(){
             alert(this.color);
          }
       }
    }
    然后,即可以以常規(guī)方式創(chuàng)建ClassA的實例
    var objA = new ClassA("red");
    objA.sayColor();      //outputs "res"

    FeedBack:
    # re: javascript學(xué)習(xí)筆記(二)--繼承
    2007-04-17 12:57 | cresposhi
    我還是喜歡用混合方式。。。
    up
    不過一直沒搞明白當(dāng)年call和apply沒出來之前的那種冒充方式是怎么實現(xiàn)的,也就是文中最開始講的那種方法,高人可以指點(diǎn)一下!  回復(fù)  更多評論
      
    # re: javascript學(xué)習(xí)筆記(二)--繼承
    2007-04-17 12:58 | cresposhi
    順便加一句,現(xiàn)在用于實現(xiàn)集成的lib實在太多了,選擇一種lib之后就用它的吧,方便!
      回復(fù)  更多評論
      
    # re: javascript學(xué)習(xí)筆記(二)--繼承
    2007-04-17 15:44 | 小祝
    呵呵~我也不是很清楚呢,看的不是很懂。
    是啊,現(xiàn)在有很多庫很好用啊,這里介紹它的原理嘛。
    有助于理解別人是怎么實現(xiàn)的。  回復(fù)  更多評論
      
    # re: javascript學(xué)習(xí)筆記(二)--繼承
    2008-04-16 00:05 | Aragorn

    老祝的文章太好了!
    呵呵!我也覺得混合方式好些!
    更加有面向?qū)ο蟮母杏X!
    對象冒充的方式感覺很復(fù)雜,用混合方式既簡潔又很好理解!
    現(xiàn)在的庫包很多,都讓人應(yīng)接不暇,覺得prototype好些,更像是javascript原型的擴(kuò)展!
    呵呵!  回復(fù)  更多評論
      
    主站蜘蛛池模板: 久久狠狠躁免费观看2020| 黄+色+性+人免费| 亚洲av日韩av无码黑人| 91久久成人免费| 大桥未久亚洲无av码在线| 亚洲熟妇中文字幕五十中出| 亚洲香蕉免费有线视频| 亚洲爆乳精品无码一区二区| 中文字幕第13亚洲另类| 99精品国产免费久久久久久下载| 羞羞视频免费网站入口| 亚洲精品免费在线观看| 国产免费人视频在线观看免费| 一个人免费视频观看在线www | 久久亚洲精品无码观看不卡| 日韩av无码久久精品免费| 青草久久精品亚洲综合专区| 亚洲AV日韩AV高潮无码专区| 在线观看免费国产视频| 日韩午夜理论免费TV影院| 色欲aⅴ亚洲情无码AV| 亚洲高清在线mv| 亚洲?v女人的天堂在线观看| 久久久久久精品成人免费图片| 免费视频成人国产精品网站| tom影院亚洲国产一区二区| 国产亚洲精品资源在线26u| 免费毛片在线视频| 1000部夫妻午夜免费| 中国极品美軳免费观看| 在线亚洲v日韩v| 亚洲AV综合色区无码二区偷拍 | 久久久久久久99精品免费| 国产精品亚洲二区在线| 亚洲a视频在线观看| 亚洲精品视频在线| 国产成人综合亚洲AV第一页| 日韩中文无码有码免费视频| 四虎永久在线精品免费观看视频| 老司机69精品成免费视频| 一级女性全黄生活片免费看|