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

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

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

    邊城愚人

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

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

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

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

    ???
    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中沒(méi)有私有屬性的概念,所有的屬性都是共有的,但為了表明一些屬性的私有特性,人們習(xí)慣在屬性名前加上“_”。),當(dāng)?shù)谝淮螌?shí)例化Animal時(shí),if條件就為真,這樣就會(huì)定義Animal中的函數(shù)屬性。由于“Animal._initialized = true;”的存在,函數(shù)的定義調(diào)用一次而無(wú)論實(shí)例化多少個(gè)對(duì)象。

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

    評(píng)論

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

    寫(xiě)錯(cuò)了吧  回復(fù)  更多評(píng)論
      

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

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

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

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

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

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

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

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


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲欧美日韩中文无线码 | 亚洲国产成人久久一区WWW| 亚洲三级中文字幕| 久久久久久毛片免费播放| 亚洲丁香色婷婷综合欲色啪| 国产成年无码久久久免费| 亚洲av日韩综合一区在线观看| 人妻免费一区二区三区最新| 亚洲乱码国产一区三区| 成人久久免费网站| 亚洲美免无码中文字幕在线| 在线看免费观看AV深夜影院| 亚洲综合欧美色五月俺也去| 在线视频免费国产成人| 人妻免费久久久久久久了| 丁香五月亚洲综合深深爱| 久久精品成人免费观看| 亚洲一级在线观看| 无码国模国产在线观看免费| 免费精品久久久久久中文字幕| 国产性爱在线观看亚洲黄色一级片| 国产成年无码久久久免费| 亚洲精品影院久久久久久| 好男人视频社区精品免费| 日韩免费码中文在线观看| 亚洲∧v久久久无码精品| 国产免费看JIZZ视频| 国内成人精品亚洲日本语音| 亚洲人色婷婷成人网站在线观看| 99久久99久久免费精品小说| 亚洲中文字幕无码久久| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久午夜无码免费| 国内精品久久久久影院亚洲| 免费大黄网站在线观| 久久精品国产免费| 亚洲av无码专区在线电影 | 在线观看视频免费完整版| 特级做a爰片毛片免费看| 久久久亚洲欧洲日产国码二区| 国产色婷婷精品免费视频|