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

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

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

    乖,別哭的薄殼
    ~一份耕耘,一份收獲~
    posts - 23,comments - 260,trackbacks - 0

    一、定義類(lèi)或?qū)ο?br>1.工廠方式
    創(chuàng)建對(duì)象car
    var oCar = new Object;
    oCar.color = "red";
    oCar.doors = 4;
    oCar.mpg = 23;
    oCar.showColor = function(){
       alert(this.corlor);
    };

    創(chuàng)建多個(gè)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"
    這個(gè)例子中,每次調(diào)用函數(shù)createCar(),都要?jiǎng)?chuàng)建新函數(shù)showColor(),意味著每個(gè)對(duì)象都有自己的showColor()版本,事實(shí)上,每個(gè)對(duì)象都共享了同一個(gè)函數(shù)。
    有些開(kāi)發(fā)者在工廠函數(shù)外定義對(duì)象的方法,然后通過(guò)屬性指向該方法,從而避開(kāi)這個(gè)問(wèn)題。
    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"
    從功能上講,這樣解決了重復(fù)創(chuàng)建函數(shù)對(duì)象的問(wèn)題,但該函數(shù)看起來(lái)不像對(duì)象的方法。所有這些問(wèn)題引發(fā)了開(kāi)發(fā)者定義的構(gòu)造函數(shù)的出現(xiàn)。

    2.構(gòu)造函數(shù)方法
    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"
    就像工廠函數(shù),構(gòu)造函數(shù)會(huì)重復(fù)生成函數(shù),為每個(gè)對(duì)象都創(chuàng)建獨(dú)立的函數(shù)版本。不過(guò),也可以用外部函數(shù)重寫(xiě)構(gòu)造函數(shù),同樣,這么做語(yǔ)義上無(wú)任何意義。

    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();
    它解決了前面兩種方式存在的兩個(gè)問(wèn)題。但并不盡人意。首先,這個(gè)構(gòu)造函數(shù)沒(méi)有參數(shù)。使用原型方式時(shí),不能通過(guò)構(gòu)造函數(shù)傳遞參數(shù)初始化屬性的值,這點(diǎn)很令人計(jì)厭,但還沒(méi)完,真正的問(wèn)題出現(xiàn)在屬性指向的是對(duì)象,而不是函數(shù)時(shí)。考慮下面的例子:
    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.混合的構(gòu)造函數(shù)/原型方式
    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"
    現(xiàn)在就更像創(chuàng)建一般對(duì)象了。所有的非函數(shù)屬性都有構(gòu)造函數(shù)中創(chuàng)建,意味著又可用構(gòu)造函數(shù)的參數(shù)賦予屬性默認(rèn)值了。因?yàn)橹粍?chuàng)建showColor()函數(shù)的一個(gè)實(shí)例,所以沒(méi)有內(nèi)存浪費(fèi)。

    5.動(dòng)態(tài)原型方法
    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"
    動(dòng)態(tài)原型方法的基本想法與混合的構(gòu)造函數(shù)/原型方式相同,即在構(gòu)造函數(shù)內(nèi)定義非函數(shù)屬性,而函數(shù)屬性則利用原型屬性定義。唯一的區(qū)別是賦予對(duì)象方法的位置。

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

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

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

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

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

    posted on 2007-04-16 22:20 小祝 閱讀(918) 評(píng)論(4)  編輯  收藏 所屬分類(lèi): Javascript

    FeedBack:
    # re: javascript學(xué)習(xí)筆記(一)--對(duì)象
    2007-04-17 12:38 | cresposhi
    very good!
    我一般使用混合模式,是學(xué)eric的,推薦大家使用。如果弄不明白可以看看大師們的源代碼。  回復(fù)  更多評(píng)論
      
    # re: javascript學(xué)習(xí)筆記(一)--對(duì)象
    2007-04-20 19:00 | 睿不可當(dāng)
    小祝 辛苦了
    這么好的文章!
    頂了!  回復(fù)  更多評(píng)論
      
    # re: javascript學(xué)習(xí)筆記(一)--對(duì)象
    2008-03-07 13:19 | 很好頂了
    很好頂了很好頂了很好頂了很好頂了很好頂了很好頂了  回復(fù)  更多評(píng)論
      
    # re: javascript學(xué)習(xí)筆記(一)--對(duì)象
    2008-04-15 23:44 | Aragorn
    老祝的文章太好了!
    我也覺(jué)得混合模式更好些,更像是創(chuàng)建對(duì)象的過(guò)程,而且沒(méi)有內(nèi)存的浪費(fèi)!
    老祝辛苦了!
    頂!  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 亚洲精品高清在线| 亚洲中字慕日产2021| 亚洲午夜无码久久久久| 亚洲激情视频网站| 一级人做人a爰免费视频| 99久久免费国产香蕉麻豆| 亚洲国产av无码精品| 亚洲日韩中文字幕| a级毛片免费全部播放无码| 成人午夜视频免费| 亚洲第一区香蕉_国产a| 日韩大片免费观看视频播放| 无码精品A∨在线观看免费| 亚洲乱码国产乱码精品精| 亚洲av色香蕉一区二区三区| 30岁的女人韩剧免费观看| 亚洲人成亚洲人成在线观看 | 热久久这里是精品6免费观看| 国产午夜亚洲不卡| 美女尿口扒开图片免费| 成年大片免费视频| 免费精品国自产拍在线播放| 亚洲中文字幕不卡无码| 免费大片av手机看片高清| 在线观看亚洲精品福利片| 亚洲电影免费在线观看| 亚洲国产精品无码久久SM| eeuss草民免费| 天堂亚洲免费视频| 精品亚洲视频在线| 国产午夜免费福利红片| 亚洲欧美成人av在线观看| 亚洲黄色片免费看| 国产亚洲精品免费| 国产大片91精品免费观看男同| 在线亚洲高清揄拍自拍一品区| 中文日本免费高清| 亚洲精品无码专区久久久 | 国产成人亚洲综合a∨| 亚洲AV无码1区2区久久| 国产精品免费看香蕉|