<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 俏物悄語購物網站
    愛神的箭會計師的  回復  更多評論
      

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲AV永久无码精品水牛影视| 黄a大片av永久免费| 亚洲精品无码成人片久久| 久久精品无码免费不卡| 久久精品亚洲乱码伦伦中文| 日韩在线观看免费| 精品亚洲视频在线观看| 成人片黄网站色大片免费观看cn| 国产aⅴ无码专区亚洲av麻豆 | 国产成人99久久亚洲综合精品| 黄网站色成年片大免费高清| 亚洲伊人久久综合中文成人网 | 国产一精品一av一免费爽爽| 亚洲网址在线观看你懂的| 91热成人精品国产免费| 亚洲国产成人精品无码区在线网站| 国拍在线精品视频免费观看| 亚洲精品无码久久| 亚洲精品动漫人成3d在线 | 两个人日本免费完整版在线观看1| 亚洲午夜福利在线观看| 57pao国产成视频免费播放| 亚洲国产成人精品无码区在线秒播| 成人免费网站在线观看| 免费人成动漫在线播放r18| 亚洲av综合av一区| 成年网站免费视频A在线双飞| 老子影院午夜伦不卡亚洲| 亚洲欧洲自拍拍偷午夜色无码| 1000部羞羞禁止免费观看视频| 亚洲色大成WWW亚洲女子| 国产日韩成人亚洲丁香婷婷| 无码囯产精品一区二区免费 | 中文字幕在线亚洲精品| 91免费在线播放| 一级黄色免费大片| 亚洲国产中文在线二区三区免| 免费在线观看理论片| 91精品啪在线观看国产线免费| 亚洲av综合av一区二区三区| 亚洲高清专区日韩精品|