<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)航:
     
    主站蜘蛛池模板: 在线免费观看国产视频| 久久aⅴ免费观看| 天天影院成人免费观看| 最近最新的免费中文字幕| 久久精品亚洲综合一品| 青青草免费在线视频| 亚洲av永久无码精品国产精品 | 亚洲黄色片在线观看| 中文字幕视频免费| 亚洲精品视频在线免费| 四虎在线成人免费网站| 国产亚洲中文日本不卡二区| 日韩a在线观看免费观看| 另类专区另类专区亚洲| 美腿丝袜亚洲综合| 日韩电影免费观看| 亚洲国产午夜精品理论片| 大学生一级特黄的免费大片视频| 亚洲hairy多毛pics大全| 2022中文字字幕久亚洲| 日本免费久久久久久久网站| 亚洲黄色在线观看网站| 成人毛片免费视频| 特a级免费高清黄色片| 精品亚洲永久免费精品| 国产大片91精品免费观看不卡| 亚洲久热无码av中文字幕 | 亚洲精品午夜无码专区| 亚洲视频在线免费看| 男人的天堂av亚洲一区2区| 日日噜噜噜噜夜夜爽亚洲精品| 99精品国产成人a∨免费看| 亚洲熟妇少妇任你躁在线观看| 亚洲精品无码专区2| 100部毛片免费全部播放完整| 亚洲爆乳精品无码一区二区| 国内精品99亚洲免费高清| 日韩免费精品视频| 亚洲五月午夜免费在线视频| 亚洲精品国产手机| 精品国产亚洲男女在线线电影|