邊城愚人

          如果我不在邊城,我一定是在前往邊城的路上。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            31 隨筆 :: 0 文章 :: 96 評論 :: 0 Trackbacks
          ??? 最近在閱讀《 JavaScript 高級程序設(shè)計》,未免遺忘讀過的內(nèi)容,就打算以博客的形式做些讀書筆記。今天介紹的是 JavaScript 中的四種定義對象的方法,除了這四種方法,還有工廠方法來定義對象,但考慮到其簡單性及非正規(guī)性,這里就不做介紹。和 Java 這樣的面向?qū)ο笳Z言相比, JavaScript 更像是函數(shù)式語言,其并沒有類的概念,蓋之以對象定義的概念,而具體創(chuàng)建的對象叫做對象的實例。
          ??? 1)構(gòu)造函數(shù)方式定義對象。 這種方式是在構(gòu)造函數(shù)內(nèi)定義屬性和方法。這里舉個簡單的例子:
          ???
          function?Animal(name){
          ????????
          this.name?=?name;
          ????????
          this.introduceSelf?=?function(){
          ????????????window.alert(
          "I?am?a?"?+?this.name+"!");
          ????????};
          }
          ??? 對象的實例化如下:
          var?dog?=?new?Animal("dog");
          dog.?introduceSelf();
          ??? 當然,
          也可以將對象的方法在構(gòu)造函數(shù)外定義,如下所示:
          function?introduceSelf(){
          ????window.alert(
          "I?am?a?"?+?this.name+"!");
          }
          ????
          function?Animal(name){
          ????
          this.name?=?name;
          ????
          this.introduceSelf?=?introduceSelf();
          }
          ??
          這種在構(gòu)造函數(shù)內(nèi)定義所有的屬性和方法的方式,使得構(gòu)造函數(shù)相當于 Java 中類的概念。而將方法的具體定義獨立地放在構(gòu)造函數(shù)外,會使得對象的定義和方法的定義并不緊密,如果在一個文件中這樣的方法和對象定義多的話,就會看起來凌亂許多。

          ??? 2)
          原型方式。 該方式利用對象的 prototype 屬性,可以將其看成創(chuàng)建新對象所依賴的原型(關(guān)于
          prototype 的詳細信息,可以百度一下,這方面的資料還是很多的)。這種方式將構(gòu)造函數(shù)做成空構(gòu)造函數(shù),然后將所有的屬性和方法被直接賦予 prototype 屬性,還是前面的例子,重寫如下:
          ???
          function?Animal(){
          ????
          }
          Animal.prototype.name?
          =?"animal";
          Animal.prototype.introduceSelf?
          =?function(){
          ????window.alert(
          "I?am?a?"?+?this.name+"!");
          };
          //對象的實例如下:
          var?dog?=?new?Animal();
          dog.name?
          =?"dog";
          dog.introductSelf();
          ??
          這種方式的缺點是顯而易見的,就是不能在構(gòu)造函數(shù)中對屬性進行賦值操作。還有一點是,對于引用類型的屬性(如 Array 實例),實例化的多個對象將共享一個引用。正因為這么多的問題,這種對象定義的方式并不可取。

          ??? 3)
          構(gòu)造函數(shù)、原型混合方式。 這種方式是最為流行的對象定義方式。它結(jié)合了構(gòu)造函數(shù)及原型方式。這種方式用構(gòu)造函數(shù)定義對象的所有非函數(shù)屬性,用原型方式定義對象的函數(shù)屬性(方法)。重寫前面的例子:
          function?Animal(name){
          ????
          this.name?=?name;
          }
          Animal.prototype.introduceSelf?
          =?function(){
          ????window.alert(
          "I?am?a?"?+?this.name+"!");
          };
          ???
          ??? 4)
          動態(tài)原型方式。 和構(gòu)造函數(shù)、原型混合方式相比,動態(tài)原型方式只是在函數(shù)屬性定義的位置上有所不同。重寫前面的例子:

          ???
          function ?Animal(name){
          ????
          this .name? = ?name;
          ????
          if ( typeof ?Animal._initialized? == ?'undefined'){
          ????????Animal.prototype.introduceSelf?
          = ? function (){
          ????????????window.alert(
          " I?am?a? " ? + ? this .name + " ! " );
          ????????};
          ????????Animal._initialized?
          = ? true ;
          ????}
          }
          ? ??? 其中_initializedAnimal的全局私有屬性(JavaScript中沒有私有屬性的概念,所有的屬性都是共有的,但為了表明一些屬性的私有特性,人們習(xí)慣在屬性名前加上“_”。),當?shù)谝淮螌嵗?/span>Animal時,if條件就為真,這樣就會定義Animal中的函數(shù)屬性。由于“Animal._initialized = true;”的存在,函數(shù)的定義調(diào)用一次而無論實例化多少個對象。

          posted on 2007-04-08 11:24 kafka0102 閱讀(22163) 評論(8)  編輯  收藏 所屬分類: Ajax

          評論

          # re: JavaScript中定義對象的四種方式 2007-04-08 14:42 zkj
          this.introduceSelf = introduceSelf();

          寫錯了吧  回復(fù)  更多評論
            

          # re: JavaScript中定義對象的四種方式 2007-04-08 20:28 kafka0102
          確實不對,我試了一下,name屬性根本沒有起作用,看來外部方法introduceSelf()需要添加參數(shù)name才行!  回復(fù)  更多評論
            

          # re: JavaScript中定義對象的四種方式 2007-04-09 11:57 Toez
          樓主的 this.introduceSelf = introduceSelf(); 是不是寫錯了?

          這樣的用意, 并不是把introduceSelf()的句柄傳給 內(nèi)部變量this.introduceSelf, 而是首先執(zhí)行了introduceSelf()這個方法, 由于只是一個alert, 故此方法會返回一個underfined, 然后賦值給this.introduceSelf.  回復(fù)  更多評論
            

          # re: JavaScript中定義對象的四種方式 2007-04-09 19:11 kafka0102
          學(xué)藝不精,還需努力!  回復(fù)  更多評論
            

          # re: JavaScript中定義對象的四種方式 2010-07-31 09:06 gaohongsheng
          應(yīng)該是this.introduceSelf = introduceSelf;
          這樣才對!  回復(fù)  更多評論
            

          # re: JavaScript中定義對象的四種方式 2011-01-17 21:16 LuckyGeb
          你這是類的構(gòu)造,對象構(gòu)造你只講了一種,就是new,不要搞混  回復(fù)  更多評論
            

          # re: JavaScript中定義對象的四種方式 2012-04-28 11:08 入門菜鳥
          this.introduceSelf=introduceSelf();這句是沒有問題的,只不過函數(shù)introduceSelf()這個函數(shù)里的this指的是window對象,而不再是Animal對象,所以alert("I am a " + this.name+"!");輸出的內(nèi)容實際上是"I am a !",也就是這里面的this.name的值是""。一點愚見,希望指正,Thanks.  回復(fù)  更多評論
            

          # re: JavaScript中定義對象的四種方式 2013-01-20 12:18 翟進雄
          感覺W3Cschool中ECMA中關(guān)于對象的介紹,還是比較全面的,可參考一下.  回復(fù)  更多評論
            


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 广平县| 蓝山县| 板桥市| 宿迁市| 金昌市| 林州市| 临邑县| 辉县市| 遂川县| 明溪县| 嘉善县| 仙居县| 太湖县| 库车县| 南充市| 海盐县| 冕宁县| 灌南县| 泾源县| 镇远县| 五大连池市| 晋城| 东乡族自治县| 伊川县| 东辽县| 武山县| 连江县| 遂川县| 黎平县| 马尔康县| 禄劝| 伊金霍洛旗| 虞城县| 宝应县| 余江县| 浦东新区| 佳木斯市| 青浦区| 临泽县| 玉山县| 宜阳县|