標籤:多個 fun 預設值 訪問 ret 方法 直接 config tps
對象(Object)應該算是js中最為重要的部分,也是js中非常難懂晦澀的一部分。更是面試以及架構設計中各出沒。本文章,主要參考JavaScript紅寶書(JavaScript進階程式設計 第六章)以及各大博主部落格
談談對象屬性的特性
畢竟是物件導向編程,我們在討論如何物件導向之前先討論討論對象具有哪些屬性和特性。
屬性類型
簡單的說,對象擁有四個屬性:
- [[Configurable]]:是否可以通過delete刪除,能否修改屬性的特性。直白點:是否可配置
- [[Enumerable]]:枚舉性,表示是否可以通過for-in迴圈返回
- [[Writable]]:可寫性:是否可以修改屬性的值
- [[Value]]:包含屬性的值,也就是對應的可讀性。 以上四個對象的屬性的屬性類型預設值分別為:true,true,true,undefined。
如果要修改屬性預設的特性,必須通過Object.defineProperty()方法。大致如下:
var animal = {};Object.defineProperty(animal,"name",{ writable:false, value: ‘dog‘});console.log(animal.name);//doganimal.name = ‘cat‘;console.log(animal.name);//dog
writable:false,表示不可更改屬性的值。從上面的執行個體可以看出,在調用Object.defineProperty()方法後,如果不指定 configurable、enumerable、writable 特性的值時,預設為FALSE。
訪問器屬性
訪問器屬性不包含資料值,但是包含getter和setter函數。在讀取存取器屬性時,會調用getter函數,這個函數負責返回有效值。在寫入訪問器屬性時,回到用setter函數並傳入新值。
- [[Configurable]]:表示是否可以通過delete刪除。預設為TRUE
- [[Enumerable]]:同上面介紹的Enumerable一樣,預設為true
- [[Get]]:讀取資料時候調用的方法。預設為undefined
- [[Set]]:在寫入屬性值得時候預設調用的方法。預設為undefined
這裡不做過多解釋,直接看例子吧(來自js紅寶書)
var book = { _year:2012, edition:1};Object.defineProperty(book, ‘year‘,{ get:function(){ return this._year }, set:function(value){ if(value>2012){ this._year = value, this.edition++ } }});book.year = 2013;console.log(book.edition);//2
其實對於多個屬性的定義,我們可以使用Object.defineProperties方法。然後對於讀取屬性的特性我們可以使用Object.getOwnPropertyDescriptor()方法。
建立對象
建立對象,我們不是直接可以通過Object的建構函式或者對象字面量的方法來實現對象的建立嘛?當然,這些方法是可以的,但是有一個明顯的缺點:使用同一個介面建立很多個物件,產生大量重複的代碼。所以這裡,我們使用如下的一些操作
原廠模式
一種很基礎的設計模式,簡而言之就是用函數來封裝以特定介面建立對象的細節。
function createAnimal(name,type){ var o = new Object(); o.name = name; o.type = type; o.sayName = function(){ alert(this.name) } return o;}var cat = createAnimal(‘小貓‘,‘cat‘);var dog = createAnimal(‘小狗‘,‘dog‘);
JavaScript物件導向總結