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

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

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

    posts - 297,  comments - 1618,  trackbacks - 0
     

    說明:本文為《JavaScript高級程序設(shè)計》第4章學(xué)習(xí)筆記。

    一.             繼承機制實例

    幾何形狀只有兩種,即橢圓形和多變形。圓是橢圓形的一種,它只有一個焦點。三角形、矩形和五邊形都是多邊形的一種,具有不同數(shù)量的邊。正方形是矩形的一種,所有的邊等長。這就構(gòu)成了繼承關(guān)系。

    形狀是橢圓形和多邊形的基類。圓形繼承了橢圓形,因此圓形是橢圓形的子類,橢圓形是圓形的超類

    二.             繼承機制的實現(xiàn)

    要用ECMAScript實現(xiàn)繼承機制,首先從基類入手。所有開發(fā)者定義的類都可以作為基類。出于安全原因,本地類和宿主類不能作為基類,這樣可以防止編譯過的瀏覽器級的代碼,因為這些代碼可以被用于惡意攻擊。

    選定基類后,就可以創(chuàng)建它的子類了。是否使用基類完全由你決定。有時,你可能想創(chuàng)建不能直接使用的基類,它只是用戶給予類公共通用的函數(shù)。在這種情況下,基類被看作抽象類

    1.繼承的方式

    JavaScript中的繼承機制并不是明確規(guī)定的,而是通過模仿實現(xiàn)的。開發(fā)者可以自己決定最適用的繼承方式。

    1)對象冒充

    原理:構(gòu)造函數(shù)使用this關(guān)鍵字給所有屬性和方法賦值。因為構(gòu)造函數(shù)只是一個函數(shù),所以可使ClassA的構(gòu)造函數(shù)成為ClassB的方法,然后調(diào)用它。ClassB就會收到ClassA的構(gòu)造函數(shù)定義的屬性方法。

    Eg. 

    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);
    }
         
    }


    2)call()方法

    call()方法是與經(jīng)典的對象冒充方法最相似的方法。它的第一個參數(shù)用作this的對象,其他參數(shù)都直接傳遞給函數(shù)本身。

    Eg. 可將上例中的ClassB改成如下后,可達到先前同樣的效果: 

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

    }

     

    3)apply()方法

    該方法有兩個參數(shù),用作this的對象要傳遞給的參數(shù)的數(shù)組。

    Eg.

    function sayColor(sPrefix, sSuffix) {
              alert(sPrefix 
    + this.color + sSuffix);
    }
    ;
    var obj = new Object();
    obj.color 
    = "red";
    sayColor.apply(obj, 
    new Array("The color is "", a very nice color indeed."));

    可將上述的ClassB修改為如下這樣:

    function ClassB(sColor, sName) {
           ClassA.apply(
    thisnew Array(sColor));
           
    this.name = sName;
           
    this.sayName = function() {
           alert(
    this.name);
    }
    ;
    }

     

    4)原型鏈

    Prototype對象是個模板,要實例化的對象都以這個模板為基礎(chǔ)。總而言之,prototype對象的任何屬性和方法都被傳遞給那個類的所有實例。原型鏈利用這種功能來實現(xiàn)繼承機制。

    Eg.

    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);
    }
    ;

    原型鏈的弊端是不支持多重繼承。記住,原型鏈會用另一類型的對象重寫類的prototype屬性。

    5)混合模式

    對象冒充的主要問題是必須使用構(gòu)造函數(shù)的方式,這不是最好的選擇。不過如果使用原型鏈,就無需使用構(gòu)造函數(shù)了。如果將這兩種方式混合起來,將會達到更好的效果。

    Eg.

     fuction 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 
    = function() {
        alert(
    this.name);
    }
    ;

      調(diào)用代碼如下所示:

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

     

    2.一個更實際的例子

    下面講一個PolygonTriangleRectangle的例子。

    1)創(chuàng)建基類Polygon

    Eg. 

     function Polygon(iSides) {
             
    this.sides = iSides;
    }


    Polygon.prototype.getArea 
    = function() {
            
    return 0;
    }
    ;


     

    2)創(chuàng)建子類

    三角形Triangle的內(nèi)容如下:

    function Triangle(iBase, iHeight) {
            Polygon.call(
    this3);
            
    this.base = iBase;
            
    this.height = iHeight;
    }


    Triangle.prototype 
    = new Polygon();
    Triangle.prototype.getArea 
    = function() {
            
    return 0.5 * this.base * this.height;
    }
    ;

    Rectangle的ECMAScript代碼如下:

    function Rectangle(iLength; iWidth) {
            Polygon.call(
    this4);
            
    this.length = iLength;
            
    this.width = iWidth;
    }


    Rectangle.prototype 
    = new Polygon();
    Rectangle.prototype 
    = function() {
            
    return this.length * this.width;
    }
    ;

     

    3)測試代碼 

    var triangle = new Triangle(124);
    var rectangle = new Rectangle(2210);
    alert(triangle.sides);
    alert(triangle.getArea());
    alert(rectangle.sides);
    alert(rectangle.getArea());

     

    4)采用動態(tài)原型方法如何?

    function Polygon(iSides) {
            
    this.sides = iSides;
            
    if (typeof Polygon._initialized == "undefined"{
           Polygon.prototype.getArea 
    = function() {
           
    return 0;
    }
    ;

    Polygon._initialized 
    = true;
    }

    }


    function Triangle(iBase, iHeight) {
            Polygon.call(
    this3);
            
    this.base = iBase;
            
    this.height = iHeight;
            
    if (typeof Triangle._initialized == "undefined"{
           Triangle.prototype 
    = new Polygon();
           Triangle.prototype.getArea 
    = function() {
           
    return 0.5 * this.base * this.height;
    }
    ;

    Triangle. _initialized 
    = true;
    }

    }


    Triangle.prototype 
    = new Polygon();

     

    三.             小結(jié)

    本章介紹了ECMAScript中用對象冒充和原型鏈實現(xiàn)的繼承概念。學(xué)會結(jié)合使用這些方式才是建立類之間的繼承機制的最好方式。

    posted on 2007-09-04 08:59 阿蜜果 閱讀(957) 評論(3)  編輯  收藏 所屬分類: Javascript


    FeedBack:
    # re: JavaScript學(xué)習(xí)筆記——繼承
    2007-09-04 13:48 | freeman
    好東西! 我先頂一下,不知道有沒有數(shù)據(jù)庫設(shè)計的東東,小弟正在學(xué)那個。  回復(fù)  更多評論
      
    # re: JavaScript學(xué)習(xí)筆記——繼承
    2007-09-04 15:54 | mortal
    姐姐,有點問題請教下,
    <object>
    <param name="enableContextMenu" value="0">
    <param name="fullScreen" value="0">
    </object>
    假如我要取得enableContextMenu的值,請問怎么用js取得?  回復(fù)  更多評論
      
    # re: JavaScript學(xué)習(xí)筆記——繼承
    2007-09-10 11:32 | 冬虎
    小丫頭,不錯,只是照片有點糊,看不清臉,能不能換張清晰點的吼吼,  回復(fù)  更多評論
      
    <2007年9月>
    2627282930311
    2345678
    9101112131415
    16171819202122
    23242526272829
    30123456

          生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
          我的作品:
          玩轉(zhuǎn)Axure RP  (2015年12月出版)
          

          Power Designer系統(tǒng)分析與建模實戰(zhàn)  (2015年7月出版)
          
         Struts2+Hibernate3+Spring2   (2010年5月出版)
         

    留言簿(263)

    隨筆分類

    隨筆檔案

    文章分類

    相冊

    關(guān)注blog

    積分與排名

    • 積分 - 2294512
    • 排名 - 3

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 三上悠亚亚洲一区高清| 99久久久精品免费观看国产| 污污免费在线观看| 亚洲AV无码国产剧情| 亚洲av成人一区二区三区观看在线| 波多野结衣亚洲一级| 亚洲日本久久久午夜精品| 国产成人精品日本亚洲网址| 国产精品高清视亚洲精品| 国产精品亚洲一区二区麻豆| 亚洲欧洲无卡二区视頻| 亚洲成a人片在线不卡一二三区| 狼人大香伊蕉国产WWW亚洲| 羞羞网站免费观看| 深夜免费在线视频| 国产一级一毛免费黄片| 嫩草在线视频www免费看| 国产激情免费视频在线观看| 在线免费观看你懂的| 亚洲成在人线aⅴ免费毛片| 四虎影视大全免费入口| 国产精品视_精品国产免费| 亚洲国产成人爱av在线播放| 久久精品国产精品亚洲艾草网美妙| 亚洲国产精品va在线播放| 亚洲高清视频在线观看| 亚洲av午夜精品无码专区| 亚洲精品国产首次亮相| 免费很黄无遮挡的视频毛片| 在线观看免费黄色网址| 在线免费中文字幕| 免费观看的毛片手机视频| 亚洲福利精品电影在线观看| 国产成A人亚洲精V品无码| 亚洲午夜电影在线观看高清 | 久久精品国产精品亚洲| 久久精品国产亚洲香蕉| 亚洲男人天堂2022| 乱爱性全过程免费视频| 97在线视频免费| 国产精品黄页在线播放免费|