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

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

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

    隨筆 - 81  文章 - 1033  trackbacks - 0
    <2007年4月>
    25262728293031
    1234567
    891011121314
    15161718192021
    22232425262728
    293012345

    在浮躁的年代里,我們進取心太切,患得患失;虛榮心太強,戰戰兢兢。一心爭強好勝,惟恐榜上無名。
    I think I can fly , and flying like a bird !
    程序員一名,已售出,缺貨中!

    我的郵件聯系方式

    用且僅用于MSN

    博客點擊率
    free web counter
    free web counter

    常用鏈接

    留言簿(36)

    隨筆檔案

    搜索

    •  

    積分與排名

    • 積分 - 186921
    • 排名 - 309

    最新評論

    閱讀排行榜

    評論排行榜

          從基礎講起,從重點講起!我覺得祝子這個系列的文章非常好,不管是對于javascript的入門同學還是有一定javascript經驗的老手都是個很好的系統學習資料。來自經典的《javascript高級程序設計》。

    原文出處:http://www.tkk7.com/ilovezmh/archive/2007/04/16/111098.html

    一、定義類或對象
    1.工廠方式
    創建對象car
    var oCar = new Object;
    oCar.color = "red";
    oCar.doors = 4;
    oCar.mpg = 23;
    oCar.showColor = function(){
       alert(this.corlor);
    };

    創建多個car
    function createCar(color, doors, mpg) {
        var tempcar = new Object;
        tempcar.color = color;
        tempcar.doors = doors;
        tempcar.mpg = mpg;
        tempcar.showColor = function () {
            alert(this.color)
        };
       return tempcar;
    }

    var car1 = createCar("red", 4, 23);
    var car2 = createCar("blue", 3, 25);
    car1.showColor();    //outputs "red"
    car2.showColor();    //outputs "blue"
    這個例子中,每次調用函數createCar(),都要創建新函數showColor(),意味著每個對象都有自己的showColor()版本,事實上,每個對象都共享了同一個函數。
    有些開發者在工廠函數外定義對象的方法,然后通過屬性指向該方法,從而避開這個問題。
    function showColor(){
       alert(this.color);
    }
    function createCar(color, doors, mpg) {
        var tempcar = new Object;
        tempcar.color = color;
        tempcar.doors = doors;
        tempcar.mpg = mpg;
        tempcar.showColor = showColor;
        return tempcar;
    }

    var car1 = createCar("red", 4, 23);
    var car2 = createCar("blue", 3, 25);
    car1.showColor();    //outputs "red"
    car2.showColor();    //outputs "blue"
    從功能上講,這樣解決了重復創建函數對象的問題,但該函數看起來不像對象的方法。所有這些問題引發了開發者定義的構造函數的出現。

    2.構造函數方法
    function Car(sColor, iDoors, iMpg) {
        this.color = sColor;
        this.doors = iDoors;
        this.mpg = iMpg;
        this.showColor = function () {
            alert(this.color)
        };
    }

    var oCar1 = new Car("red", 4, 23);
    var oCar2 = new Car("blue", 3, 25);
    oCar1.showColor();    //outputs "red"
    oCar2.showColor();    //outputs "blue"
    就像工廠函數,構造函數會重復生成函數,為每個對象都創建獨立的函數版本。不過,也可以用外部函數重寫構造函數,同樣,這么做語義上無任何意義。

    3.原型方式
    function Car(){
    }
    Car.prototype.color = "red";
    Car.prototype.doors= 4;
    Car.prototype.mpg= 23;
    Car.prototype.showColor = function(){
       alert(this.color);
    }

    var oCar1 = new Car();
    var oCar2 = new Car();
    它解決了前面兩種方式存在的兩個問題。但并不盡人意。首先,這個構造函數沒有參數。使用原型方式時,不能通過構造函數傳遞參數初始化屬性的值,這點很令人計厭,但還沒完,真正的問題出現在屬性指向的是對象,而不是函數時??紤]下面的例子:
    function Car(){
    }
    Car.prototype.color = "red";
    Car.prototype.doors= 4;
    Car.prototype.mpg= 23;
    Car.prototype.drivers = new Array("Mike","Sue");
    Car.prototype.showColor = function(){
       alert(this.color);
    }

    var oCar1 = new Car();
    var oCar2 = new Car();
    oCar1.drivers.push("Matt");
    alert(oCar1.drivers);      //outputs "Mike,Sue,Matt"
    alert(oCar2.drivers);      //outputs "Mike,Sue,Matt"

    4.混合的構造函數/原型方式
    function Car(sColor, iDoors, iMpg) {
        this.color = sColor;
        this.doors = iDoors;
        this.mpg = iMpg;
        this.drivers = new Array("Mike", "Sue");
    }

    Car.prototype.showColor = function () {
        alert(this.color);
    };

    var oCar1 = new Car("red", 4, 23);
    var oCar2 = new Car("blue", 3, 25);

    oCar1.drivers.push("Matt");

    alert(oCar1.drivers);    //outputs "Mike,Sue,Matt"
    alert(oCar2.drivers);    //outputs "Mike,Sue"
    現在就更像創建一般對象了。所有的非函數屬性都有構造函數中創建,意味著又可用構造函數的參數賦予屬性默認值了。因為只創建showColor()函數的一個實例,所以沒有內存浪費。

    5.動態原型方法
    function Car(sColor, iDoors, iMpg) {
        this.color = sColor;
        this.doors = iDoors;
        this.mpg = iMpg;
        this.drivers = new Array("Mike", "Sue");

        if (typeof Car._initialized == "undefined") {

            Car.prototype.showColor = function () {
                alert(this.color);
            };

            Car._initialized = true;
        }
    }


    var oCar1 = new Car("red", 4, 23);
    var oCar2 = new Car("blue", 3, 25);

    oCar1.drivers.push("Matt");

    alert(oCar1.drivers);    //outputs "Mike,Sue,Matt"
    alert(oCar2.drivers);    //outputs "Mike,Sue"
    動態原型方法的基本想法與混合的構造函數/原型方式相同,即在構造函數內定義非函數屬性,而函數屬性則利用原型屬性定義。唯一的區別是賦予對象方法的位置。

    6.混合工廠方式
    這種方式通常是在不能應用前一種方式時的變通方法。它的目的是創建假構造函數,只返回另一種對象的新實例。
    function Car() {
        var tempcar = new Object;
        tempcar.color = "red";
        tempcar.doors = 4;
        tempcar.mpg = 23;
        tempcar.showColor = function () {
            alert(this.color)
        };
       return tempcar;
    }
    與經典方式不同,這種方式使用new運算符,使它看起來像真正的構造函數。

    7.采用哪種方式
       如前所述,目前使用最廣泛的是混合的構造函數/原型方式。些外,動態原型方法也很流行,在功能上與前者等價,可以采用這兩種方式中的任何一種。

    二、修改對象
    1.創建新方法
    可以用prototype屬性為任何已有的類定義新方法,就像處理自己的類一樣。
    例:
    Array.prototype.indexOf = function(vItem){
       for(var i=0;i<this.length;i++){
          if(vItem == this[i]){
             return i;
          }
       }
       retunr -1;
    }
    最后,如果想給ECMAScript中的每個本地對象添加新方法,必須在Object對象的prototype屬性上定義它。

    2.重定義已有方法
    就像能給自己的類定義新方法一樣,也可重定義已有的方法。函數名只是指向函數的指針,因此可以輕易地使它指向其他函數。

    Function.prototype.toString = function(){
       return "Function code hidden";
    }
    function sayHi(){
       alert("hi");
    }
    alert(sayHi.toString());      //outputs "Function code hidden"

    posted on 2007-04-18 23:31 cresposhi 閱讀(1349) 評論(3)  編輯  收藏

    FeedBack:
    # re: javascript學習筆記(一)--對象【轉載自好朋友祝子的blog】 2007-04-19 12:16 靜兒
    的確挺基礎的,也挺有價值的。  回復  更多評論
      
    # re: javascript學習筆記(一)--對象【轉載自好朋友祝子的blog】[未登錄] 2007-04-29 13:28 Iwishyou
    嗯, 一切的框架都是在基礎上面搭建起來的  回復  更多評論
      
    # re: javascript學習筆記(一)--對象【轉載自好朋友祝子的blog】 2007-04-30 23:43 cresposhi
    說的不錯,其實往往基礎最重要,萬變不離其中  回復  更多評論
      

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲国模精品一区| 亚洲制服丝袜在线播放| 日韩精品免费视频| 亚洲jizzjizz在线播放久| 最好免费观看韩国+日本| 9i9精品国产免费久久| 亚洲激情视频网站| 亚洲国产电影av在线网址| 99久久久国产精品免费蜜臀| 亚洲日韩精品无码AV海量| 中文亚洲AV片不卡在线观看| 波多野结衣在线免费视频| 成人午夜免费视频| 亚洲H在线播放在线观看H| 亚洲午夜久久久影院伊人| 成人性生交大片免费看无遮挡 | 国产自国产自愉自愉免费24区| 亚洲an日韩专区在线| 亚洲熟妇中文字幕五十中出| 夫妻免费无码V看片| 无码一区二区三区免费| 美女视频黄a视频全免费网站一区| 亚洲视频国产精品| 中文字幕亚洲天堂| 日本免费人成黄页网观看视频| 最近中文字幕国语免费完整| 一级做性色a爰片久久毛片免费| 亚洲日韩国产精品无码av| 亚洲色欲久久久综合网东京热| 在线免费观看一级毛片| 亚欧免费视频一区二区三区| 成人免费777777被爆出| 国产在亚洲线视频观看| 丁香婷婷亚洲六月综合色| 亚洲AV无码一区东京热久久| 久久精品国产精品亚洲| 日韩高清在线高清免费| 无码视频免费一区二三区| 777成影片免费观看| 永久在线观看免费视频 | 蜜臀亚洲AV无码精品国产午夜.|