在學習JavaScript原型(prototype)和原型鏈(prototype chain)知識的時候,發現數據屬性和訪問器屬性的重要性,通過不斷的查找相關知識,淺顯理解如下,若有差錯,希望不吝賜教: 一、數據屬性 1.什麼是數據屬性 預設的對象的屬性就是數據屬性,一般用於數據存儲,有四個特性描述 ...
在學習JavaScript原型(prototype)和原型鏈(prototype chain)知識的時候,發現數據屬性和訪問器屬性的重要性,通過不斷的查找相關知識,淺顯理解如下,若有差錯,希望不吝賜教:
一、數據屬性
1.什麼是數據屬性
預設的對象的屬性就是數據屬性,一般用於數據存儲,有四個特性描述它的行為:
①屬性值 [value]:用來保存這個屬性的數據值,預設值是undefined;
②可寫性 [writable]:表示是否能修改這個屬性的值,預設值是true;
③可枚舉性 [enumberable]:表示是否能通過for-in迴圈遍歷返回,預設是true;
④可配置性 [configurable]:表示是否能通過delete刪除屬性從而重新定義屬性,是否能修改屬性特性,
是否能把數據屬性修改為訪問器屬性。預設值是true;
通過Object.getOwnPropertyDescriptor()可以查詢person中name的特性
通過Object.defineProperty()可以修改其特性
修改了person中name屬性的writable為false之後,person中的name變為不可修改
2.什麼是訪問器屬性
對應get/set操作,可用於在監聽屬性的存儲過程中限制一些屬性的行為
訪問器屬性也有四個特性描述:
①讀取屬性函數[get] : 在讀取屬性時調用的函數
②寫入屬性函數[set] :在寫入函數時調用的函數
③可枚舉性 [enumberable]:表示是否能通過for-in迴圈遍歷返回,預設是false;
④可配置性 [configurable]:表示是否能通過delete刪除屬性從而重新定義屬性,是否能修改屬性特性,
是否能把訪問器屬性修改為數據屬性。預設值是false;
訪問器屬性不能直接定義,必須使用Object.defineProperty()定義
訪問器屬性可以通過Object.getOwnPropertyDescriptor()查詢
Object.defineProperty()定義了訪問器屬性(age),當age屬性修改時,name屬性和_age屬性會相應修改。
由此可以想到數據的雙向綁定
小結
在一個對象(person)中設置一個私有屬性(_age:開頭下劃線代表私有屬性----龜腚),再為這個對象設置
訪問器屬性age(本身還未在對象中定義),當person.age進行修改時觸發set函數,通過這個函數可以進行數據的操作,
比如數據的判斷賦值等一系列操作,從而實現數據的雙向綁定。