<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高級程序設計》第4章學習筆記。

    一.             繼承機制實例

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

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

    二.             繼承機制的實現

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

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

    1.繼承的方式

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

    1)對象冒充

    原理:構造函數使用this關鍵字給所有屬性和方法賦值。因為構造函數只是一個函數,所以可使ClassA的構造函數成為ClassB的方法,然后調用它。ClassB就會收到ClassA的構造函數定義的屬性方法。

    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()方法是與經典的對象冒充方法最相似的方法。它的第一個參數用作this的對象,其他參數都直接傳遞給函數本身。

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

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

    }

     

    3)apply()方法

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

    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對象是個模板,要實例化的對象都以這個模板為基礎。總而言之,prototype對象的任何屬性和方法都被傳遞給那個類的所有實例。原型鏈利用這種功能來實現繼承機制。

    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)混合模式

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

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

      調用代碼如下所示:

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

     

    2.一個更實際的例子

    下面講一個PolygonTriangleRectangle的例子。

    1)創建基類Polygon

    Eg. 

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


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


     

    2)創建子類

    三角形Triangle的內容如下:

    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)采用動態原型方法如何?

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

     

    三.             小結

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

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


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

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

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

    留言簿(263)

    隨筆分類

    隨筆檔案

    文章分類

    相冊

    關注blog

    積分與排名

    • 積分 - 2298120
    • 排名 - 3

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲国产精品无码久久九九| 又色又污又黄无遮挡的免费视| 亚洲AV无码一区二区乱子伦| 麻豆国产精品入口免费观看| 亚洲精品在线免费观看| 久久精品免费大片国产大片 | 亚洲人成在线中文字幕| 亚洲精品乱码久久久久久中文字幕| 日本一道综合久久aⅴ免费| 国产精品亚洲综合| 自拍偷自拍亚洲精品情侣| 国产精品va无码免费麻豆| 国产无遮挡又黄又爽免费网站| 国产成人精品久久亚洲高清不卡 | 麻豆69堂免费视频| 亚洲中文字幕AV每天更新| 亚洲电影在线播放| 亚洲一区二区三区高清| 亚洲成AV人片在线观看ww| 国产亚洲综合成人91精品 | 男人和女人高潮免费网站| 亚洲国产精品无码第一区二区三区 | 亚洲国产区男人本色在线观看| 亚洲精品成人av在线| 日韩一品在线播放视频一品免费| 99国产精品永久免费视频| 人体大胆做受免费视频| 亚洲国产日韩在线一区| 亚洲经典在线观看| 99ri精品国产亚洲| 久久综合亚洲色HEZYO社区 | 久久免费精品一区二区| 亚洲日韩精品国产一区二区三区| 日韩精品亚洲aⅴ在线影院| 亚洲中文字幕无码专区| 亚洲女同成人AⅤ人片在线观看| 青青青免费国产在线视频小草| 乱淫片免费影院观看| 一级黄色毛片免费看| www一区二区www免费| 91精品成人免费国产|