javascript學習筆記[6]--面向對象


         今天又是宅在家中一天,看了面向對象編程,包含以下幾個章節,創建類和使用類,類成員訪問控制,繼承和組合,靜態成員和靜態類,多態,原型鏈本質論。因為已經有了學習其他面向對象語言的經歷,所以這邊看的速度快了點,預計明天開始進入javascript內建類。

         有一件略微憂傷的事,昨天寫的學習筆記【5】--函數2被博客園移出首頁了,估計是那管理員看我一天發了三篇隨筆,而且深度不夠吧,所以看不下去了,卻弄得我好憂傷,好憂傷,好了,這一節就盡量寫的長一點,然后多一些自己的理解吧,簡單的知識就不說了,哎,這種學習性的東西其實就是這樣。。

         6.1面向對象--基礎概念

              這里我不仔細說了,就羅列一些基礎知識點:

               對象,實例,類(對象時類的實例)

               優點:可重用,易維護

               基本特征:封裝,繼承,多態(類一個方法多種形態),(抽象)

         6.2 創建類--構造器方法

               使用函數創建類,函數本身也被稱為該類的構造器(也稱為構造器方法,構造方法)。

               javascript是基於原型的面向對象----important.

View Code
function Person(){
  this.name;
  this.age;
  this.showInfo = function(){
        return "我的名字是"+this.name+"我現在"+this.age+"歲。";
  }
}
var  tom = new Person();
tom.name = "Tom";
tom.age = 22;
var info = tom.showInfo();
document.write(info+"<br />");

             實例化就用new,Object,Array不需要使用new關鍵字就可以實例化。

        6.3 定義方法和屬性

            1)this關鍵字---看上面的代碼就是通過this定義屬性(其實用this關鍵字的時候很容易犯錯誤,尤其是又有閉包函數,這邊如果記得的話在總結一篇)

            2)prototype定義

View Code
//prototype定義方法,屬性也類似
function Person(myName,myAge){
   this.name = myName;
   this.age = myAge;
}
Person.protoype.showInfo = function(){
   return "name = "+name+",age = "+age;
};
 //prototype另一個重要作用就是為類添加新成員
 function showDetail(){
       return "我是一只菜鳥";
 }
 Person.prototype.showDetail = showDetail;
 var person = new Person("tony",22);
 document.write(person.showDetail());

 

            3)Object類,return擴展

                Object類直接定義一個實例,並為該對象賦屬性和方法,很好的體現了javascript名值對的概念。見如下代碼

View Code
var person = {
name: "tony",
age: 22,
showInfo: function(){
      return "name="+name+",age="+age;
  }
}
document.write(person.showInfo());

 

              下面是用return語句定義方法和屬性,還有使用prototype和Object配合定義方法和屬性

View Code
function Person(myName,myAge){
 return{
        name:  myName,
        age: myAge,
        showInfo: function(){
        return "name = "+name+",age = "+age;
      }
   }
}


//prototype和Object配合為類定義方法和屬性
function Person(){}
Person.prototype = {
                name:  "tony",
        age: 22,
        showInfo: function(){
           return "name = "+name+",age = "+age;
        }
};

 

        6.4 使用get和set存取器---java中的get,set方法相同

        6.5類和成員訪問控制---public和private變量

        6.6 繼承和組合

              繼承:記住Child.prototype = new Father(),這就實現了繼承,那些關於使用基類的構造器方法,實現其他語言中super方法就可以了。

             組合:記住把手,腿,頭等其他部件組成人,這就是組合的思想,具體代碼就不貼了,就是在組合的類中(人)實現方法中新建一個手,然后使用手的方法。

             這里有個概念,is-a和has-a。is-a是屬於概念,has-a是包含概念。

        6.7 靜態成員,靜態類和枚舉

              靜態類:就是對比於現實中那些獨一無二的東西。世界上就有一個月亮,所以它可以定義為一個靜態類。如果想把成員聲明為靜態,只需將屬性或者方法賦給類本身。就這樣。還有一些注意事項就不說了。

        6.8 多態--重載和覆蓋

              一個類中有多個方法名相同的方法---重載,但是在javascript中不支持直接定義多個方法來實現重載,下面的代碼利用arguments.length判斷參數個數,typeof判斷參數類型來實現重載

View Code
function overLoadTest(){
    var len = arguments.length;
    if(len == 2){
        if(typeof(arguments[0]) =="number" && typeof(arguments[1]) == "number"){
            //執行函數
        }else if(typeof(arguments[0]) =="string" && typeof(arguments[1]) == "string"){
            
        }else{
            throw new Error("兩個參數類型不對");
        }
    }
    if(len == 3){
        if(){
        }else if(){
            
        }else{
            
        }
    }
}

 

             在新類中覆蓋基類的方法---覆蓋,只需要為子類新定義一個同名的方法成員即可實現覆蓋。就不寫代碼了。

        6.9 原型鏈本質論-----重點

              這里我也有很多東西不知道,所以多寫一些,大家一起學習吧。知識點如下:

              每個類都有一個prototype屬性(靜態屬性),該屬性值標示該類的一個對象,即原型對象。

             原型對象上定義的屬性中就有關於基類的信息,然后基類上的prototype也有它的基類信息,這樣就建立了一個鏈條----原型鏈(prototype chain)--繼承關系引起的

             原型鏈的盡頭是Object的原型對象,該對象的內部prototype的值為null。

             ECMA-262規定:類定義的時候,它有原型對象,包好一些內部特定的屬性,作為類的特性,其中兩個內部屬性就是【prototype】(該類的父類的原型對象)和【class】(類名)。在非ie瀏覽器中可以用_proto_訪問,例如:

            Array.prototype._proto_ == Object.prototype.

           原型鏈的組成部分:實現繼承和分享屬性(看一下上面的代碼就知道了)

            下面是幾個方法:

            Object.getPrototypeOf()方法等到指定對象的prototype屬性,替代_proto_屬性

            Class.prototype.isPrototype(object),查看對象是否在指定對象的原型鏈中。

            oObject.hasOwnProperty(propName),查看指定對象是否定義了特定屬性

            Object.propertyIsEnumerabel(),查看指定的屬性是否存在以及是否可枚舉。

            就這些吧,挺晚了。明天繼續。

 以上全部都屬個人原創,請大家轉載的時候附上原創鏈接: http://www.cnblogs.com/tonylp


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM