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

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

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

    隨筆 - 154  文章 - 60  trackbacks - 0
    <2007年10月>
    30123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    聲明:

    該blog是為了收集資料,認(rèn)識(shí)朋友,學(xué)習(xí)、提高技術(shù),所以本blog的內(nèi)容除非聲明,否則一律為轉(zhuǎn)載!!

    感謝那些公開(kāi)自己技術(shù)成果的高人們!?。?/p> 支持開(kāi)源,尊重他人的勞動(dòng)??!

    常用鏈接

    留言簿(3)

    隨筆分類(lèi)(148)

    隨筆檔案(143)

    收藏夾(2)

    其他

    學(xué)習(xí)(技術(shù))

    觀察思考(非技術(shù))

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    用定義函數(shù)的方式定義類(lèi)
    在面向?qū)ο蟮乃枷胫?,最核心的概念之一就是?lèi)。一個(gè)類(lèi)表示了具有相似性質(zhì)的一類(lèi)事物的抽象,通過(guò)實(shí)例化一個(gè)類(lèi),可以獲得屬于該類(lèi)的一個(gè)實(shí)例,即對(duì)象。
    在JavaScript中定義一個(gè)類(lèi)的方法如下:
    function class1(){
           //類(lèi)成員的定義及構(gòu)造函數(shù)
    }
    這里class1既是一個(gè)函數(shù)也是一個(gè)類(lèi)??梢詫⑺斫鉃轭?lèi)的構(gòu)造函數(shù),負(fù)責(zé)初始化工作。

    使用new操作符獲得一個(gè)類(lèi)的實(shí)例
    在前面介紹基本對(duì)象時(shí),已經(jīng)用過(guò)new操作符,例如:
    new Date();
    表示創(chuàng)建一個(gè)日期對(duì)象,而Date就是表示日期的類(lèi),只是這個(gè)類(lèi)是由JavaScript內(nèi)部提供的,而不是由用戶定義的。
    new操作符不僅對(duì)內(nèi)部類(lèi)有效,對(duì)用戶定義的類(lèi)也同樣有效,對(duì)于上節(jié)定義的class1,也可以用new來(lái)獲取一個(gè)實(shí)例:
    function class1(){
           //類(lèi)成員的定義及構(gòu)造函數(shù)
    }
    var obj1=new class1();
    拋開(kāi)類(lèi)的概念,從代碼的形式上來(lái)看,class1就是一個(gè)函數(shù),那么是不是所有的函數(shù)都可以用new來(lái)操作呢?是的,在JavaScript中,函數(shù)和類(lèi)就是一個(gè)概念,當(dāng)對(duì)一個(gè)函數(shù)進(jìn)行new操作時(shí),就會(huì)返回一個(gè)對(duì)象。如果這個(gè)函數(shù)中沒(méi)有初始化類(lèi)成員,那就會(huì)返回一個(gè)空的對(duì)象。例如:
    //定義一個(gè)hello函數(shù)
    function hello(){
          alert("hello");
    }
    //通過(guò)new一個(gè)函數(shù)獲得一個(gè)對(duì)象
    var obj=new hello();
    alert(typeof(obj));
    從運(yùn)行結(jié)果看,執(zhí)行了hello函數(shù),同時(shí)obj也獲得了一個(gè)對(duì)象的引用。當(dāng)new一個(gè)函數(shù)時(shí),這個(gè)函數(shù)就是所代表類(lèi)的構(gòu)造函數(shù),其中的代碼被看作為了初始化一個(gè)對(duì)象。用于表示類(lèi)的函數(shù)也稱為構(gòu)造器。

    使用方括號(hào)([ ])引用對(duì)象的屬性和方法
    在JavaScript中,每個(gè)對(duì)象可以看作是多個(gè)屬性(方法)的集合,引用一個(gè)屬性(方法)很簡(jiǎn)單,如:
    對(duì)象名.屬性(方法)名
    還可以用方括號(hào)的形式來(lái)引用:
    對(duì)象名["屬性(方法)名"]
    注意,這里的方法名和屬性名是一個(gè)字符串,不是原先點(diǎn)(? )號(hào)后面的標(biāo)識(shí)符,例如:
    var arr=new Array();
    //為數(shù)組添加一個(gè)元素
    arr["push"]("abc");
    //獲得數(shù)組的長(zhǎng)度
    var len=arr["length"];
    //輸出數(shù)組的長(zhǎng)度
    alert(len);
    由此可見(jiàn),上面的代碼等價(jià)于:
    var arr=new Array();
    //為數(shù)組添加一個(gè)元素
    arr.push("abc");
    //獲得數(shù)組的長(zhǎng)度
    var len=arr.length;
    //輸出數(shù)組的長(zhǎng)度
    alert(len);
    這種引用屬性(方法)的方式和數(shù)組類(lèi)似,體現(xiàn)了JavaScript對(duì)象就是一組屬性(方法)的集合這個(gè)性質(zhì)。
    這種用法適合不確定具體要引用哪個(gè)屬性(方法)的情況,例如:一個(gè)對(duì)象用于表示用戶資料,用一個(gè)字符串表示要使用的那個(gè)屬性,就可以用這種方式來(lái)引用:
    <script language="JavaScript" type="text/javascript">
    <!--
    //定義了一個(gè)User類(lèi),包括兩個(gè)成員age和sex,并指定了初始值。
    function User(){
          this.age=21;
          this.sex="male";
    }
    //創(chuàng)建user對(duì)象
    var user=new User();
    //根據(jù)下拉列表框顯示用戶的信息
    function show(slt){
          if(slt.selectedIndex!=0){
                   alert(user[slt.value]);
          }
    }
    //-->
    </script>
    <!--下拉列表框用于選擇用戶信息-->
    <select onchange="show(this)">
          <option>請(qǐng)選擇需要查看的信息:</option>
          <option value="age">年齡</option>
          <option value="sex">性別</option>
    </select>
    在這段代碼中,使用一個(gè)下拉列表框讓用戶選擇查看哪個(gè)信息,每個(gè)選項(xiàng)的value就表示用戶對(duì)象的屬性名稱。這時(shí)如果不采用方括號(hào)的形式,可使用如下代碼來(lái)實(shí)現(xiàn):
    function show(slt){
          if(slt.selectedIndex!=0){
                  if(slt.value=="age")alert(user.age);
                  if(slt.value=="sex")alert(user.sex);
          }
    }
    而使用方括號(hào)語(yǔ)法,則只需寫(xiě)為:
    alert(user[slt.value]);
    方括號(hào)語(yǔ)法像一種參數(shù)語(yǔ)法,可用一個(gè)變量來(lái)表示引用對(duì)象的哪個(gè)屬性。如果不采用這種方法,又不想用條件判斷,可以使用eval函數(shù):
    alert(eval("user."+slt.value));
    這里利用eval函數(shù)的性質(zhì),執(zhí)行了一段動(dòng)態(tài)生成的代碼,并返回了結(jié)果。
    實(shí)際上,在前面講述document的集合對(duì)象時(shí),就有類(lèi)似方括號(hào)的用法,比如引用頁(yè)面中一個(gè)名為“theForm”的表單對(duì)象,以前的用法是:
    document.forms["theForm"];
    也可以改寫(xiě)為:
    document.forms.theForm;
    forms對(duì)象是一個(gè)內(nèi)部對(duì)象,和自定義對(duì)象不同的是,它還可以用索引來(lái)引用其中的一個(gè)屬性。

    動(dòng)態(tài)添加、修改、刪除對(duì)象的屬性和方法
    上一節(jié)介紹了如何引用一個(gè)對(duì)象的屬性和方法,現(xiàn)在介紹如何為一個(gè)對(duì)象添加、修改或者刪除屬性和方法。
    其他語(yǔ)言中,對(duì)象一旦生成,就不可更改,要為一個(gè)對(duì)象添加、修改成員必須要在對(duì)應(yīng)的類(lèi)中修改,并重新實(shí)例化,程序也必須重新編譯。JavaScript提供了靈活的機(jī)制來(lái)修改對(duì)象的行為,可以動(dòng)態(tài)添加、修改、刪除屬性和方法。例如:先用類(lèi)Object來(lái)創(chuàng)建一個(gè)空對(duì)象user:
    var user=new Object();
    1.添加屬性
    這時(shí)user對(duì)象沒(méi)有任何屬性和方法,可以為它動(dòng)態(tài)的添加屬性,例如:
    user.name="jack";
    user.age=21;
    user.sex="male";
    通過(guò)上述語(yǔ)句,user對(duì)象具有了三個(gè)屬性:name、age和sex。下面輸出這三個(gè)語(yǔ)句:
    alert(user.name);
    alert(user.age);
    alert(user.sex);
    由代碼運(yùn)行效果可知,三個(gè)屬性已經(jīng)完全屬于user對(duì)象了。
    2.添加方法
    添加方法的過(guò)程和添加屬性類(lèi)似:
    user.alert=function(){
         alert("my name is:"+this.name);
    }
    這就為user對(duì)象添加了一個(gè)方法“alert”,通過(guò)執(zhí)行它,彈出一個(gè)對(duì)話框顯示自己的名字:
    user.alert();
    修改屬性和方法
    修改一個(gè)屬性和方法的過(guò)程就是用新的屬性替換舊的屬性,例如:
    user.name="tom";
    user.alert=function(){
          alert("hello,"+this.name);
    }
    這樣就修改了user對(duì)象name屬性的值和alert方法,它從顯示“my name is”對(duì)話框變?yōu)榱孙@示“hello”對(duì)話框。

    刪除屬性和方法
    刪除一個(gè)屬性和方法的過(guò)程也很簡(jiǎn)單,就是將其置為undefined:
    user.name=undefined;
    user.alert=undefined;
    這樣就刪除了name屬性和alert方法。
    在添加、修改或者刪除屬性時(shí),和引用屬性相同,也可以采用方括號(hào)([])語(yǔ)法:
    user["name"]="tom";
    使用這種方式還有一個(gè)特點(diǎn),可以使用非標(biāo)識(shí)符字符串作為屬性名稱,例如標(biāo)識(shí)符中不允許以數(shù)字開(kāi)頭或者出現(xiàn)空格,但在方括號(hào)([])語(yǔ)法中卻可以使用:
    user["my name"]="tom";
    需要注意,在使用這種非標(biāo)識(shí)符作為名稱的屬性時(shí),仍然要用方括號(hào)語(yǔ)法來(lái)引用:
    alert(user["my name"]);
    而不能寫(xiě)為:
    alert(user.my name);
    事實(shí)上,JavaScript中的每個(gè)對(duì)象都是動(dòng)態(tài)可變的,這給編程帶來(lái)了靈活性,也和其他語(yǔ)言產(chǎn)生了區(qū)別。

    使用大括號(hào)({ })語(yǔ)法創(chuàng)建無(wú)類(lèi)型對(duì)象
    傳統(tǒng)的面向?qū)ο笳Z(yǔ)言中,每個(gè)對(duì)象都會(huì)對(duì)應(yīng)到一個(gè)類(lèi)。上一節(jié)講this指針時(shí)提到,JavaScript中的對(duì)象其實(shí)就是屬性(方法)的一個(gè)集合,并沒(méi)有嚴(yán)格意義上類(lèi)的概念。所以它提供了一種簡(jiǎn)單的方式來(lái)創(chuàng)建對(duì)象,即大括號(hào)({})語(yǔ)法:
    {
          property1:statement,
          property2:statement2,
          …,
          propertyN:statmentN
    }
    通過(guò)大括號(hào)括住多個(gè)屬性或方法及其定義(這些屬性或方法用逗號(hào)隔開(kāi)),來(lái)實(shí)現(xiàn)對(duì)象的定義,這段代碼就直接定義個(gè)了具有n個(gè)屬性或方法的對(duì)象,其中屬性名和其定義之間用冒號(hào)(:)隔開(kāi)。例如:
    <script language="JavaScript" type="text/javascript">
    <!--
    var obj={};     //定義了一個(gè)空對(duì)象
    var user={
          name:"jack",   //定義了name屬性,初始化為jack
          favoriteColor:["red","green","black","white"],//定義了顏色喜好數(shù)組
          hello:function(){  //定義了方法hello
                 alert("hello,"+this.name);
          },
          sex:"male"    //定義了性別屬性sex,初始化為male
    }

    //調(diào)用user對(duì)象的方法hello
    user.hello();
    //-->
    </script>
    第一行定義了一個(gè)無(wú)類(lèi)型對(duì)象obj,它等價(jià)于:
    var obj=new Object();
    接著定義了一個(gè)對(duì)象user及其屬性和方法。注意,除了最后一個(gè)屬性(方法)定義,其他的必須以逗號(hào)(,)結(jié)尾。其實(shí),使用動(dòng)態(tài)增減屬性的方法也可以定義一個(gè)完全相同的user對(duì)象,讀者可使用前面介紹的方法實(shí)現(xiàn)。
    使用這種方式來(lái)定義對(duì)象,還可以使用字符串作為屬性(方法)名,例如:
    var obj={"001":"abc"}
    這就給對(duì)象obj定義了一個(gè)屬性“001”,這并不是一個(gè)有效的標(biāo)識(shí)符,所以要引用這個(gè)屬性必須使用方括號(hào)語(yǔ)法:
    obj["001"];
    由此可見(jiàn),無(wú)類(lèi)型對(duì)象提供了一種創(chuàng)建對(duì)象的簡(jiǎn)便方式,它以緊湊和清晰的語(yǔ)法將一個(gè)對(duì)象體現(xiàn)為一個(gè)完整的實(shí)體。而且也有利于減少代碼的體積,這對(duì)JavaScript代碼來(lái)說(shuō)尤其重要,減少體積意味著提高了訪問(wèn)速度。
    prototype原型對(duì)象
    prototype對(duì)象是實(shí)現(xiàn)面向?qū)ο蟮囊粋€(gè)重要機(jī)制。每個(gè)函數(shù)(function)其實(shí)也是一個(gè)對(duì)象,它們對(duì)應(yīng)的類(lèi)是“Function”,但它們身份特殊,每個(gè)函數(shù)對(duì)象都具有一個(gè)子對(duì)象prototype。即prototype表示了該函數(shù)的原型,而函數(shù)也是類(lèi),prototype就是表示了一個(gè)類(lèi)的成員的集合。當(dāng)通過(guò)new來(lái)獲取一個(gè)類(lèi)的對(duì)象時(shí),prototype對(duì)象的成員都會(huì)成為實(shí)例化對(duì)象的成員。
    既然prototype是一個(gè)對(duì)象,可以使用前面兩節(jié)介紹的方法對(duì)其進(jìn)行動(dòng)態(tài)的修改,這里先給出一個(gè)簡(jiǎn)單的例子:
    //定義了一個(gè)空類(lèi)
    function class1(){
          //empty
    }
    //對(duì)類(lèi)的prototype對(duì)象進(jìn)行修改,增加方法method
    class1.prototype.method=function(){
          alert("it's a test method");
    }
    //創(chuàng)建類(lèi)class1的實(shí)例
    var obj1=new class1();
    //調(diào)用obj1的方法method
    obj1.method();

    posted on 2007-10-09 09:45 lk 閱讀(413) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): ajax&js
    主站蜘蛛池模板: 精品国产香蕉伊思人在线在线亚洲一区二区| 亚洲熟妇无码另类久久久| 国产亚洲成在线播放va| 亚洲综合无码AV一区二区| 最近2019免费中文字幕6| 日韩欧美亚洲国产精品字幕久久久| 免费一区二区视频| 一级特黄aa毛片免费观看| 亚洲国产精品无码久久98| 精品亚洲综合在线第一区| 18禁成年无码免费网站无遮挡| 亚洲精品偷拍视频免费观看| 亚洲国产精品日韩在线观看 | 国产亚洲人成A在线V网站| 最近中文字幕大全免费视频| 亚洲精品无码久久久久APP| 国产亚洲精品a在线观看app| 成年女人18级毛片毛片免费| 免费在线黄色电影| 视频一区二区三区免费观看| 亚洲综合色一区二区三区小说| 亚洲国产一区视频| 免费看国产成年无码AV片| 国产午夜无码精品免费看| 亚洲av乱码中文一区二区三区| 亚洲高清视频免费| 亚洲色精品88色婷婷七月丁香 | 亚洲人成网站在线播放影院在线 | 亚洲性无码AV中文字幕| 亚洲成a人片在线观看无码 | 亚洲国产成人资源在线软件| 亚洲人精品午夜射精日韩| 国产精品黄页在线播放免费| 国内精自视频品线六区免费| 久久久久久av无码免费看大片| 国产亚洲精品AAAA片APP| 亚洲国产精品日韩在线| 亚洲影院在线观看| 亚洲VA中文字幕无码一二三区| 全亚洲最新黄色特级网站| 免费无码又爽又刺激高潮|