今天又是宅在家中一天,看了物件導向編程,包含以下幾個章節,建立類和使用類,類成員存取控制,繼承和組合,靜態成員和靜態類,多態,原型鏈本質論。因為已經有了學習其他物件導向語言的經曆,所以這邊看的速度快了點,預計明天開始進入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