在js中有幾種模式可以建立對象,透過物件操作所包含的屬性與方法。
一般來說,構造函數名稱的第一個字母為大寫字母,非構造函數名稱的第一個字母為小寫字母,當然,構造函數與一般函數唯一的區別只是調用的方式不同而已,所以任何函數只要透過new來調用,那它就可以作為構造函數,若不透過new來調用,則與一般函數一樣。
談談我對這幾種模式的理解:
工廠模式:建立一個一般函數,在函數裡建立一個Object對象,為這個對象增添屬性與方法,同時賦予其值,最後回傳對象。無法辨識對象類型。
建構函數模式:建立建構函數,使用this來賦值,每當建立一個實例時,方法都被建立一次,而每個方法都執行相同的指令,這就多餘了。這個缺點可以透過將方法放到全域環境中,但是,這樣就沒有封裝性了。不過可以透過原型模式解決。
原型模式:每個函數都有一個prototype屬性,該屬性是一個指針,指向一個對象,該對象包含其函數創建的所有實例共享的屬性與方法。
原型對象,建構子與實例之間的關係如下圖:
圖解:1:建構子以及建構函式所建立的實例,它們的prototype屬性都指向建構函式的原型物件。
2:建構函式的原型物件具有constructor屬性,此屬性指向建構函式。
3:建構函式的原型物件所包含的所有屬性與方法可以被建構函式所建立的所有實例共用。
使用物件字面量重寫原型物件後,constructor則指向object建構函數,若需要其指向另一個建構函數,則需修改原型物件的constructor屬性的值,例如:constructor:Person,這樣Person的原型物件即使被重寫,原型物件的constructor仍指向Person建構函式。
先建立實例時:若是直接加入屬性或方法,實例可以存取。
若是重寫原型對象,則構造函數的prototype指向新的原型對象,而先前建立的實例的prototype仍指向最初的原型對象,所以實例存取不到新的原型對象的新屬性或和新方法。
原型物件包含的是共享的屬性與方法,那麼每個實例都擁有這些信息,這樣實例之間就沒有什麼不同了,而且還不可以傳參數,這不是我們所想要的。每個實例之間有共同的訊息,又有不同的訊息,所以我們可以組合使用建構函數模式與原型模式。
建構子模式與原型模式的組合使用:
態原型模式:將獨立的建構子與其原型物件結合在一起,在建構函式裡初始化原型,為其添加方法。
若該方法不存在,則將其添加到原型物件上,只在初始化原型時才執行,而且只執行一次。
寄生建構函數模式:與工廠模式類似,差異為:寄生建構函數模式為建構函數,透過new來建立實例。
穩健建構子模式:沒有公共的屬性,其方法不引用this的物件。建立實例時不使用new。只能透過方法存取屬性(即傳入的資料)。
以上這篇javascript創建物件的幾種模式介紹就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。