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

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

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

    隨筆 - 81  文章 - 1033  trackbacks - 0
    <2007年4月>
    25262728293031
    1234567
    891011121314
    15161718192021
    22232425262728
    293012345

    在浮躁的年代里,我們進(jìn)取心太切,患得患失;虛榮心太強(qiáng),戰(zhàn)戰(zhàn)兢兢。一心爭(zhēng)強(qiáng)好勝,惟恐榜上無(wú)名。
    I think I can fly , and flying like a bird !
    程序員一名,已售出,缺貨中!

    我的郵件聯(lián)系方式

    用且僅用于MSN

    博客點(diǎn)擊率
    free web counter
    free web counter

    常用鏈接

    留言簿(36)

    隨筆檔案

    搜索

    •  

    積分與排名

    • 積分 - 186918
    • 排名 - 308

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    原文出處:http://m.tkk7.com/ilovezmh/archive/2007/04/16/111106.html


    一、繼承的方式
    1.對(duì)象冒充
    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();
    所有新的屬性和新的方法都必須在刪除了新方法的代碼行后定義。否則,可能會(huì)覆蓋超類的相關(guān)屬性和方法。
    對(duì)象冒充可以支持多繼承。
    function ClassZ(){
       this.newMethod = ClassX;
       this.newMethod(sColor);
       delete this.newMethod;

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

    2.call()方法
    call()方法是與經(jīng)典的對(duì)象冒充方法最相似的方法,它的第一個(gè)參數(shù)用作this的對(duì)象,其他參數(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()方法有兩個(gè)參數(shù),用作this的對(duì)象和要傳遞參數(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í)才可以傳遞參數(shù)對(duì)象。如果不是,就必須創(chuàng)建一個(gè)單獨(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í),沒有給它傳遞參數(shù)。這在原型鏈中是標(biāo)準(zhǔn)做法。要確保構(gòu)造函數(shù)沒有任何參數(shù)。
    原型鏈的弊端是不支持多重繼承。

    5.混合方式
    與創(chuàng)建對(duì)象最好方式相似,用對(duì)象冒充繼承構(gòu)造函數(shù)的屬性,用原型鏈繼承prototype對(duì)象的方法。
    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庫(kù)
    可以從http://www.nczonline.net/downloads處下載
    zInherit庫(kù)給Object類添加了兩個(gè)方法,inheritFrom()和instanceOf()
    ClassB.prototype.inheritFrom(ClassA);
    CalssB.instanceOf(ClassA);

    2.xbObjects庫(kù)
    可以從http://archive.bclary.com/xbprojectsdocs/xbobject/處下載
    第一步,必須注冊(cè)類。
    _classes.registerClass("Subclass_Name","Superclass_Name");
             這里,子類和超類名都以字符串形式傳進(jìn)來(lái),而不是指向它們的構(gòu)造函數(shù)的指針。這個(gè)調(diào)用必須放在指定子類的構(gòu)造構(gòu)函數(shù)前。
    第二步,在構(gòu)造函數(shù)內(nèi)調(diào)用defineClass()方法,傳給它類名及被Clary稱為原型函數(shù)的指針,該函數(shù)用于初始化對(duì)象的所有屬性和方法。

    _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的實(shí)例
    var objA = new ClassA("red");
    objA.sayColor();      //outputs "res"
    posted on 2007-04-19 15:41 cresposhi 閱讀(1227) 評(píng)論(1)  編輯  收藏

    FeedBack:
    # re: javascript學(xué)習(xí)筆記(二)--繼承【轉(zhuǎn)載自好朋友祝子的blog】  2008-03-06 12:01 kirari_wxy
    你這里也荒了? 呵呵  回復(fù)  更多評(píng)論
      

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 777亚洲精品乱码久久久久久 | 日韩精品无码免费专区网站| 亚洲人成网7777777国产| 国产精品免费看久久久| 亚洲三级在线观看| 亚洲国产中文字幕在线观看| 84pao国产成视频免费播放| 亚洲a∨国产av综合av下载 | 亚洲免费视频播放| 四虎影视精品永久免费网站| 光棍天堂免费手机观看在线观看 | 69视频在线是免费观看| 亚洲午夜无码久久久久小说| 国产成人精品亚洲精品| www.免费在线观看| 亚洲第一视频在线观看免费| 亚洲丝袜中文字幕| 国外亚洲成AV人片在线观看| 国产无人区码卡二卡三卡免费| 日本永久免费a∨在线视频| 亚洲精品第五页中文字幕| 日韩亚洲国产二区| www.黄色免费网站| 青青操在线免费观看| 亚洲经典千人经典日产| 久久精品九九亚洲精品天堂| 国产免费怕怕免费视频观看| 222www在线观看免费| a级精品九九九大片免费看| 午夜亚洲国产理论片二级港台二级 | 精品女同一区二区三区免费站| 一区二区视频免费观看| 天天爽亚洲中文字幕| 黑人精品videos亚洲人| 亚洲一区二区三区无码影院| 无人在线直播免费观看| 午夜网站在线观看免费完整高清观看| 视频免费1区二区三区| 亚洲美国产亚洲AV| 色偷偷女男人的天堂亚洲网| 4444亚洲国产成人精品|