<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是為了收集資料,認識朋友,學習、提高技術,所以本blog的內容除非聲明,否則一律為轉載!!

    感謝那些公開自己技術成果的高人們!!!

    支持開源,尊重他人的勞動!!

    常用鏈接

    留言簿(3)

    隨筆分類(148)

    隨筆檔案(143)

    收藏夾(2)

    其他

    學習(技術)

    觀察思考(非技術)

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    用定義函數的方式定義類
    在面向對象的思想中,最核心的概念之一就是類。一個類表示了具有相似性質的一類事物的抽象,通過實例化一個類,可以獲得屬于該類的一個實例,即對象。
    在JavaScript中定義一個類的方法如下:
    function class1(){
           //類成員的定義及構造函數
    }
    這里class1既是一個函數也是一個類。可以將它理解為類的構造函數,負責初始化工作。

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

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

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

    刪除屬性和方法
    刪除一個屬性和方法的過程也很簡單,就是將其置為undefined:
    user.name=undefined;
    user.alert=undefined;
    這樣就刪除了name屬性和alert方法。
    在添加、修改或者刪除屬性時,和引用屬性相同,也可以采用方括號([])語法:
    user["name"]="tom";
    使用這種方式還有一個特點,可以使用非標識符字符串作為屬性名稱,例如標識符中不允許以數字開頭或者出現空格,但在方括號([])語法中卻可以使用:
    user["my name"]="tom";
    需要注意,在使用這種非標識符作為名稱的屬性時,仍然要用方括號語法來引用:
    alert(user["my name"]);
    而不能寫為:
    alert(user.my name);
    事實上,JavaScript中的每個對象都是動態可變的,這給編程帶來了靈活性,也和其他語言產生了區別。

    使用大括號({ })語法創建無類型對象
    傳統的面向對象語言中,每個對象都會對應到一個類。上一節講this指針時提到,JavaScript中的對象其實就是屬性(方法)的一個集合,并沒有嚴格意義上類的概念。所以它提供了一種簡單的方式來創建對象,即大括號({})語法:
    {
          property1:statement,
          property2:statement2,
          …,
          propertyN:statmentN
    }
    通過大括號括住多個屬性或方法及其定義(這些屬性或方法用逗號隔開),來實現對象的定義,這段代碼就直接定義個了具有n個屬性或方法的對象,其中屬性名和其定義之間用冒號(:)隔開。例如:
    <script language="JavaScript" type="text/javascript">
    <!--
    var obj={};     //定義了一個空對象
    var user={
          name:"jack",   //定義了name屬性,初始化為jack
          favoriteColor:["red","green","black","white"],//定義了顏色喜好數組
          hello:function(){  //定義了方法hello
                 alert("hello,"+this.name);
          },
          sex:"male"    //定義了性別屬性sex,初始化為male
    }

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

    posted on 2007-10-09 09:45 lk 閱讀(418) 評論(0)  編輯  收藏 所屬分類: ajax&js
    主站蜘蛛池模板: 亚洲色欲色欲www在线播放| 久久不见久久见免费影院| 亚洲中文字幕久久精品蜜桃| 亚洲精品国产精品乱码不卡√ | 亚洲精品美女在线观看播放| 4338×亚洲全国最大色成网站| AV片在线观看免费| 50岁老女人的毛片免费观看| 国产免费高清69式视频在线观看| 国产成人亚洲精品蜜芽影院| 亚洲乱码日产精品BD在线观看| 国产亚洲av片在线观看16女人 | 亚洲hairy多毛pics大全| 亚洲精品456在线播放| 亚洲第一中文字幕| 亚洲精品乱码久久久久久| 亚洲国产黄在线观看| 免费永久国产在线视频| 美女被免费视频网站a国产| 五月婷婷综合免费| 91精品免费不卡在线观看| 日韩精品免费在线视频| 成人妇女免费播放久久久| 一级毛片免费播放男男| 免费人成网站永久| 黄色一级视频免费观看| 理论亚洲区美一区二区三区| 亚洲成在人线在线播放无码| 美女视频黄免费亚洲| 久久亚洲国产成人影院| 亚洲中文字幕久久精品无码VA| 亚洲欧洲日韩极速播放| 亚洲日韩精品无码AV海量| 亚洲欧美日韩久久精品| 亚洲爆乳成av人在线视菜奈实| 亚洲人成无码网站在线观看| 亚洲爆乳无码专区www| 国产成人亚洲毛片| 一级视频在线免费观看| 国产免费MV大全视频网站| 免费萌白酱国产一区二区三区|