<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了,只是用的比較表層,會寫幾個函數(shù)而已,也沒有深入的研究過。最近一段時間,由于項目的需要,看了一些關(guān)于JavaScript的書,也寫了不少的JavaScript的代碼,慢慢開始對這個東東著迷了。現(xiàn)在JavaScript在Web應(yīng)用中的比重越來越大,各種好用的庫也層出不窮,即使對JavaScript了解的比較淺顯,也可以利用各種利器做出很不錯的作品。但是,較為深入的了解一下JavaScript的特性,對于更熟練的使用它肯定還是有很大的幫助的。

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

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

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

    借助JavaScript中的apply或者call,就可以實現(xiàn)在子類中調(diào)用父類方法。

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

    代碼如下:

     

    <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 = "由父類產(chǎn)生的圖像已經(jīng)生成在畫布上了";
        };
    };

    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插件做個廣告,那是相當?shù)暮糜冒。。?/p>

    這里通過apply來調(diào)用父類方法。

     

    JavaScript中的apply和call

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

    可以用下面的式子表達:

    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中子類調(diào)用父類方法 2010-04-30 11:55 俏物悄語購物網(wǎng)站
    愛神的箭會計師的  回復(fù)  更多評論
      

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 国产免费av片在线看| 91香蕉国产线观看免费全集| 久久久www成人免费毛片| 久久精品国产亚洲AV高清热| 日韩人妻无码精品久久免费一 | 三上悠亚在线观看免费| 国产综合精品久久亚洲| 中文字幕在线免费播放| 亚洲av午夜成人片精品网站| 美女视频黄a视频全免费网站色窝| 黑人精品videos亚洲人| 日本免费一区二区三区| 亚洲精品在线网站| 免费三级毛片电影片| 亚洲日本VA中文字幕久久道具| 处破痛哭A√18成年片免费| 爱情岛论坛亚洲品质自拍视频网站| 日本一线a视频免费观看| 免费人成在线观看播放a| 亚洲深深色噜噜狠狠爱网站| 国产午夜无码精品免费看| 亚洲精品第一国产综合精品| 成人免费777777| 全部在线播放免费毛片| 亚洲午夜久久久影院| h视频在线观看免费完整版| 亚洲av无码片区一区二区三区| 成人免费看片又大又黄| 一级看片免费视频| 亚洲一本综合久久| 成年女人毛片免费播放人| 男人和女人高潮免费网站| 亚洲av福利无码无一区二区 | 在线亚洲精品视频| 久久综合日韩亚洲精品色| 国产成在线观看免费视频| 人妻仑刮八A级毛片免费看| 亚洲国产精品国自产拍电影| 最近中文字幕无吗免费高清| 精品国产免费一区二区三区| 亚洲人成网站日本片|