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

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

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

    隨筆 - 42  文章 - 71  trackbacks - 0
    <2010年4月>
    28293031123
    45678910
    11121314151617
    18192021222324
    2526272829301
    2345678

    常用鏈接

    留言簿

    隨筆檔案

    文章分類

    文章檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    很久之前就在用JavaScript了,只是用的比較表層,會寫幾個函數而已,也沒有深入的研究過。最近一段時間,由于項目的需要,看了一些關于JavaScript的書,也寫了不少的JavaScript的代碼,慢慢開始對這個東東著迷了?,F在JavaScript在Web應用中的比重越來越大,各種好用的庫也層出不窮,即使對JavaScript了解的比較淺顯,也可以利用各種利器做出很不錯的作品。但是,較為深入的了解一下JavaScript的特性,對于更熟練的使用它肯定還是有很大的幫助的。

    JavaScript是一種基于原型(prototype-based)的語言,而Java是基于類(class-based)的語言。對于我這種先學習Java再學習JavaScript的人來說,總是會不自覺的用一些Java的概念去往JavaScript上套用。比如說,我就很想在JavaScript中使用類似Java中super.someMethod()。但是很多JavaScript的資料上最常見的寫法是:

    someObject.prototype.someMethod = function(){…};

    這樣就是完全改寫了父類的方法,是無法滿足需求的。

    借助JavaScript中的apply或者call,就可以實現在子類中調用父類方法。

    假設如下場景:根據不同的數據對生成的圖形進行不同形式的填充。父類負責生成基本的圖形,子類根據需求對父類生成的圖像進行填充。

    代碼如下:

     

    <html>
    <head>
    <meta content="text/html; charset=UTF-8"/>
    <script type="text/javascript">

    Shape = function() {
        this.id = null;
        this.picture = null;
        this.draw = function(canvas){
            this.picture = "由父類產生的圖像已經生成在畫布上了";
        };
    };

    CommonShape = function(){};
    CommonShape.prototype = new Shape();

    CrossFillShape = function(){
      this.draw = function(canvas){
        CrossFillShape.prototype.draw.apply(this, arguments);
        this.picture = this.picture + ", 然后被子類 CrossFillShape 填充";
      };
    };
    CrossFillShape.prototype = new Shape();

    SolidFillShape = function(){
      this.draw = function(canvas){
        SolidFillShape.prototype.draw.apply(this, arguments);
        this.picture = this.picture + ", 然后被子類 SolidFillShape 填充";
      };
    };
    SolidFillShape.prototype = new Shape();

    function test1() {
      var s = new CommonShape();
      s.draw();
      console.debug(s.picture);

      var cs = new CrossFillShape();
      cs.draw();
      console.debug(cs.picture);

      var ss = new SolidFillShape();
      ss.draw();
      console.debug(ss.picture);
    }

    </script>
    </head>
    <body>
    <input type="button" value="test1" onclick="test1()"/><br/>
    </body>
    </html>

     

    (上面代碼中的console對象是Firefox的Firebug插件提供的,在這里為Firebug插件做個廣告,那是相當的好用?。。?/p>

    這里通過apply來調用父類方法。

     

    JavaScript中的apply和call

    在JavaScript中,一個對象方法代碼中的this并不是一直指向這個對象,通過apply或者call就可以方便的切換this指向的方法?;蛘哒f,apply和call方法的最直接的作用就是切換this的指向,并由此可以引發很多非常靈活的用法(可以看看prototype庫的代碼,有很多apply和call)。apply和call的區別在于調用時參數傳入的方式不同:第一個參數都是對象指針(也就是說把原來代碼中的this指向哪個對象),apply的第二個參數是數組,call從第二個參數開始是實際的函數調用參數

    可以用下面的式子表達:

    foo.call(this, arg1,arg2,arg3) == foo.apply(this, arguments) == this.foo(arg1, arg2, arg3)

     

    Technorati 標簽: ,,,
    posted on 2010-04-29 20:43 YODA 閱讀(4956) 評論(1)  編輯  收藏

    FeedBack:
    # re: JavaScript中子類調用父類方法 2010-04-30 11:55 俏物悄語購物網站
    愛神的箭會計師的  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 免费国产黄网站在线观看动图| 水蜜桃亚洲一二三四在线| 一本色道久久88—综合亚洲精品 | 性xxxxx免费视频播放 | 亚洲aⅴ无码专区在线观看春色| 国产乱码免费卡1卡二卡3卡| 亚洲永久中文字幕在线| 无码国产精品一区二区免费| 亚洲国产片在线观看| 欧洲黑大粗无码免费| 亚洲熟妇av午夜无码不卡| 在线a毛片免费视频观看| 怡红院亚洲红怡院在线观看| 亚洲人成网站观看在线播放| 一个人看的免费高清视频日本| 亚洲综合在线另类色区奇米 | 4399影视免费观看高清直播| 亚洲性猛交xx乱| 在线观看人成网站深夜免费| 菠萝菠萝蜜在线免费视频| 亚洲日本中文字幕一区二区三区 | 亚洲成?Ⅴ人在线观看无码| 国产精品视频全国免费观看| 久久亚洲一区二区| 无码av免费毛片一区二区| 粉色视频在线观看www免费| 日韩亚洲变态另类中文| 1000部拍拍拍18勿入免费视频下载| 亚洲AV无码久久久久网站蜜桃 | 国产大片线上免费观看| 国产亚洲男人的天堂在线观看| 77777亚洲午夜久久多人| 99re6在线视频精品免费下载 | 亚洲av无码电影网| 亚洲国产综合人成综合网站| 久久久精品免费国产四虎| 亚洲色大18成人网站WWW在线播放| 亚洲精品岛国片在线观看| 99久久久国产精品免费牛牛| 老司机亚洲精品影院在线观看| 亚洲人成网7777777国产|