風趣的JavaScript面向對象入門課程一
在我們程序猿界一直流傳這這麽一個joke,沒女票我們可以new一個、沒房子沒票子沒車子我們同樣new一個!當然這聽著更像是一種自嘲,畢竟我們程序猿都愛自嘲,哈哈,廢話不多說,今天就由我帶著你們來入JavaScript面向對象這個坑!千萬別棄坑!
一、理解對象:
創建對象的兩種方法:直接聲明、Object的實例化
直接聲明:
1 Var zhangsan = { 2 3 Name : “zhangsan”, 4 5 Age : 29, 6 7 //創建一個introduce函數,用於返回張三的姓名 8 9 introduce.function(){ 10 11 returnzhangsan.name; 12 13 } 14 15 }
Object的實例化:
1 Var zhangsan = new Object(); 2 3 zhangsan.name = “zhangsan”; 4 5 zhangsan.age = 29; 6 7 zhangsan.introduce = function(){ 8 9 return zhangsan.name; 10 11 }; 12 13
調用方法:
1 Document.write(zhangsan.name+zhangsan.age);或者 2 3 Alert(zhangsan.introduce());
二、類的實現:
工廠生產對象:適用於當需要大規模輸出對象時的問題
1 Function CreateCar(engine,tire){ 2 3 Var car = new Object(); 4 5 car.engine=engine; 6 7 car.tire = tire; 8 9 return car; 10 11 }
調用工廠生產對象:
Var Audi = CreateCar(”four-engine”,”four-tire”);
生產出Audi一輛,即new了一個對象
說白了,工廠模式就是把創建對象的方法封裝在函數中。
實際上,當你用instanceof運算符對實例Audi檢測時:
Alert(Audi instanceof car);
結果會彈出對話框顯示false。
即Audi不是car實例化出的對象!
三、構造函數
為解決上述問題特引入構造函數大佬
將以上的代碼略作改寫:
1 Function CreateCar(engine,tire){ 2 3 this.engine=engine; 4 5 this.tire=tire; 6 7 this.drive = function(){ 8 9 document.wirte(this.engine+this.tire); 10 11 }; 12 13 }
其實構造函數就是一個帶this的普通函數,它不是大佬,哈哈!它裏面的this就指通過這個構造函數生成一個新的對象。
雖說我們揭開了它大佬的面紗,但大佬還是大佬,它還是有用的..
1 Var Audi = new car(”four-engine”,”four-tire”); 2 3 4 5 Alert(Audi instanceof car);
結果驚人的彈出顯示:true
大佬果然是大佬!
但問題又來了,大佬也不是沒有缺點,它的模式雖然好用,但是存在浪費內存的嫌疑,這就讓大佬的聲譽受到了嚴重的影響:
每一次生成一個person對象,都必須重新構建一遍sayName函數,真的麻煩!
鐺,鐺,鐺!震驚 “全局函數” 出場竟然..
1 Function sayName(){ 2 3 Document.write(this.name); 4 5 }
然後再把person類中將sayName()指向外部的sayName()
this.sayName = sayName;
厲害了wold哥!
問題又來了,在全局變量中定義的函數只能被某個對象所調用,讓這個函數有點名不副實的樣子,而且當對象如果需要很多方法,就需要定義同樣多的全局變量。這樣對象的封裝就毫無意義可言。這些問題我們都可以通過原型模式(Prototype)來解決。
原來一山更比一山高啊,這世外高人第一次見..
Person.prototype.sayName = function (){ document.write (this.name); };
與之前的:
Function sayName(){ Document.write(this.name); }
相比,第二個好low!
那麽這位世外高人有什麽用呢?
廢話不多說上代碼:
personA.sayName = function(){ document.write("personA:"+this.name+"<br/>"); }//對父對象中的方法進行復寫,personA是person函數實例化出的一個新對象
哇!QAQ
本期的風趣的JavaScript面向對象課程就結束啦,謝謝大家的瀏覽和指正!我們下期再見!
風趣的JavaScript面向對象入門課程一