1. 程式人生 > >風趣的JavaScript面向對象入門課程一

風趣的JavaScript面向對象入門課程一

顯示 col creat eof type 你們 person 返回 實現

在我們程序猿界一直流傳這這麽一個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 return
zhangsan.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面向對象入門課程一