JavaScript學習2:物件導向
很多人都知道,面向過程和物件導向的軟體開發思想,同樣我們的JavaScript也具有這兩種開發模式。今天我們來看看JavaScript中的物件導向的東西。
物件導向的語言有一個非常重要的特性,那就是類的概念,通過類我們可以建立任意多個具有相同屬性和方法的對象,而JavaScript卻沒有類的概念,但是它有對象,只是此對象非彼對象。
建立對象
//建立對象var person =new Object();person.name='lian';person.age=18;person.run=function(){return this.name+this.age +'奮鬥中……';};
這樣我們就建立了一個對象,並且為對象建立了屬性和方法,在run()方法裡的this,就代表person對象本身。這種方法是JavaScript建立對象的最基本的方法,但是我們要向建立一個類似的對象,比如name叫做Lee的,怎麼辦?那隻能重新再寫一遍相同的代碼嘍,你說可以直接將person賦值給person1啊,這樣不省事多了麼,可是這樣做會覆蓋掉person對象的屬性值的,那你說咋辦?
為瞭解決這個問題,我們可以使用原廠模式,接觸過設計模式的小夥伴們應該都知道這是什麼玩意。這裡不再多說了,直接上代碼,看如何?:
//原廠模式function CreateObject(name,age){var obj =new Object();obj.name=name;obj.age=age;obj.run=function(){return this.name+this.age+'奮鬥中……';};return obj;};//建立對象執行個體var person1 =CreateObject('Lian',18);var person2 =CreateObject('Jack',22);alert(typeof person1); //返回Objectalert(person2 instanceof Object); //返回true
怎麼樣,是不是解決了重複執行個體化的問題,但是隨之而來的另一個問題是識別問題,什麼意思,就是我們根本無法搞清楚他們到底是哪個對象的執行個體,因為記憶體中會有兩個Object類型的執行個體對象,你根本不知道哪個是哪個。
那怎麼辦呢?我們在物件導向的學習中接觸過類,那麼就一定知道建構函式,也叫做構造方法,這種函數是用來初始化類的。我們可以採用建構函式來建立特定的對象,類似於Object對象。舉個例子:
//建構函式方式function Person(name,age){this.name=name;this.age=age;this.run=function(){return this.name+this.age+'吃飯中……';};}var person1=new Person('Lian',100);var person2=new Person('Yang',100);alert(person1 instanceof Person); //返回true,很清楚的告訴我們person1從屬於Person
小結:使用建構函式的方法,既解決了重複執行個體化的問題,又解決了對象識別的問題,他與原廠模式的區別在於:
1沒有顯式的建立對象(newObject());
2直接將屬性和方法賦值給this對象;
3沒有return語句
建構函式和普通函數的唯一區別就是他們調用的方式不同。只不過,建構函式也是函數,必須要用new運算子來調用,否則就是普通函數。