ECMA-262把對象定義為:”無需屬性的集合,其屬性可以包含基本值、對象或者函數。”嚴格來講,這就相當于說明對象是一組沒有特定順序的值。對象的每個屬性或方法都有一個名字,而每個名字都映射到一個值。正因為這樣,我們可以把ECMAScript的對象想象成散列表:無非就是一組名對值,其中值可以是數據或函數。
創建自定義對象最簡單的方式就是創建一個Object的實例,然后再為他添加屬性和方法,如下所示:
var person = new Object();、person.name = "liubei";person.age = 29;person.job = "shayemuyou";person.sayName = function(){ alert(this.name);}上面的例子創建了一個名為person的對象,并為他添加了三個屬性和一個方法。其中sayName()方法用于顯示name屬性,this.name將被解析為person.name,早期的開發人員經常使用這個模式來創建對象,后來對象字面量的方法成了創建對象的首選模式,上面的例子用對象字面量的語法可以寫成如下這樣:
var person = { name:"liubei", age:29, job:"shayemuyou", sayName:function(){ alert(this.name); }}這個例子中的person對象和前面的對象是一樣的,都有相同的屬性和方法。
雖然Object構造函數或者對象字面量的方法都可以用來創建單個對象,但是這些方法有個明顯的缺點:使用同一個接口創建很多對象,會產生大量的重復代碼。為了解決這個方法,人們開始使用工廠模式的一種變體。
一、工廠模式
工廠模式是軟件工程領域一種廣為人知的設計模式,這種模式抽象了創建具體對象的過程。考慮到ECMAScript中無法創建類,開發人員就發明了一種函數,用函數來封裝以特定接口創建對象的細節,如下所示:
function createPerson(name, age, job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); } return o;}var person1 = createPerson("wei",25,"software");var person2 = createPerson("bu",25,"software");函數createPerson()能夠根據接受的參數來構建一個包含所有必要信息的Person對象。可以多次調用這個函數,每次都會返回一個包含三個屬性一個方法的對象。工廠模式雖然解決了創建多個相似對象的問題,但卻沒有解決對象識別的問題,即怎么樣知道這是哪個對象類型。
二、構造函數模式
像Array、Object這樣的原生構造函數,在運行時會自動出現在執行環境中。此外,我們可以創建自定義個構造函數,從而定義自定義類型的屬性和方法。例如,我們可以使用構造函數重寫上個例子:
function Person(name, age, job){ this.name = name; this.age = age; this.job = job; this.sayName = function(){ alert(this.name); }}var person1 = new Person("wei",25,"software");var person2 = new Person("bu",25,"software");
新聞熱點
疑難解答
圖片精選