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

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

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

    邊城愚人

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

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

    ??? 2)
    原型方式。 該方式利用對象的 prototype 屬性,可以將其看成創建新對象所依賴的原型(關于
    prototype 的詳細信息,可以百度一下,這方面的資料還是很多的)。這種方式將構造函數做成空構造函數,然后將所有的屬性和方法被直接賦予 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();
    ??
    這種方式的缺點是顯而易見的,就是不能在構造函數中對屬性進行賦值操作。還有一點是,對于引用類型的屬性(如 Array 實例),實例化的多個對象將共享一個引用。正因為這么多的問題,這種對象定義的方式并不可取。

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

    ???
    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中沒有私有屬性的概念,所有的屬性都是共有的,但為了表明一些屬性的私有特性,人們習慣在屬性名前加上“_”。),當第一次實例化Animal時,if條件就為真,這樣就會定義Animal中的函數屬性。由于“Animal._initialized = true;”的存在,函數的定義調用一次而無論實例化多少個對象。

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

    評論

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

    寫錯了吧  回復  更多評論
      

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

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

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

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

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

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

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

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


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


    網站導航:
     
    主站蜘蛛池模板: 国产一级淫片a视频免费观看| 四虎永久在线观看免费网站网址| 国产jizzjizz视频全部免费| 亚洲色丰满少妇高潮18p| 国产福利在线免费| 亚洲精品无码不卡在线播放| 好男人视频社区精品免费| 亚洲大尺度无码无码专线一区| 日本特黄特黄刺激大片免费| 国产亚洲精品仙踪林在线播放| 亚洲国产成人五月综合网 | 亚洲色偷偷偷综合网| 好吊妞在线新免费视频| 亚洲第一se情网站| 久久亚洲色一区二区三区| 人妻在线日韩免费视频| 久久亚洲日韩看片无码| 最近最好的中文字幕2019免费| 亚洲熟妇无码AV| 亚洲人成色77777在线观看大| 一个人免费视频观看在线www| 久久亚洲AV无码精品色午夜| 最近免费中文字幕大全视频| 黄色三级三级免费看| 亚洲av永久无码精品秋霞电影影院| 亚洲黄色免费网址| 久久人午夜亚洲精品无码区| 亚洲乱码中文字幕久久孕妇黑人| 免费无码中文字幕A级毛片| 亚洲性无码AV中文字幕| 亚洲一区二区三区国产精品| 一个人免费日韩不卡视频| 亚洲一本一道一区二区三区| 亚洲偷自拍拍综合网| 91高清免费国产自产| 激情无码亚洲一区二区三区| 国产亚洲精品国产| 免费看少妇作爱视频| 亚洲免费人成在线视频观看 | 亚洲一级免费毛片| 亚洲第一永久AV网站久久精品男人的天堂AV |