文章出處
文章列表
1.簡單的字面量對象
var person = { name: 'miaowwwww', age: 22, sayName: function() { console.log(this.name); } };
2.對象的屬性類型
2.1 對象的屬性分為兩類:數據屬性 和 訪問器屬性(getter/setter)
A. 數據屬性(name, age, sayName),含有4個描述其行為的特性
value: 'xxx', writable: true, // 是否可修改value configurable: false, // 是否可使用delete,刪除屬性 enumberable: false // 是否可遍歷 (for-in 中)
es5 提供接口 Object.defineProperty(obj, prop, descriptor) 修改對象的數據屬性的描述符
Object.getOwnPropertyDescriptor(obj, prop) 獲取該屬性的描述符對象
//注意:若使用api,writable,configurable,enumberable默認為false Object.defineProperty(person, 'name', { value: 'xxx', writable: true, // 是否可修改value configurable: false, // 是否可使用delete刪除屬性,能否修改屬性的特性,能否把屬性修改為訪問器屬性 enumberable: false // 是否可遍歷 (for-in 中) }) //注意:屬性的value是一個函數,同樣適用 var personDescriptor = Object.getOwnPropertyDescriptor(person, 'sayName'); console.log('一個方法的描述',personDescriptor);
注意:writable,enumberable可以多次調用接口修改,但是一旦修改configurable: false; 則產生限制,以后只能修改writable了
B.訪問器屬性:訪問器屬性不包含數據值,但是多了一對getter和setter函數(并不是一定要有,可不定義)
configurable: false, enumberable: false, [[get]]: 讀取屬性時調用的函數。默認undefined [[set]]: 寫入屬性時調用的函數。默認undefined
setter函數中可以修改對象的多個屬性值,典型的一對多,是setter的一個應用
var book = { _year: 2015, name: 'book1' } Object.defineProperty(book, year, { configurable: false, enumberable: false, get: function(){ return this._year; }, set: function(value) { this._year = value; this.name = 'book-' + value; } }) var descriptor = Object.getOwnPropertyDescriptor(book, 'name'); console.log(descriptor) console.log(book._year)
注意:因為setter和getter并不是必須的,但是若忽略某一個將會發生什么事呢?當然是不能寫入,或不能讀取咯
3. 一次性定義多個屬性,并設置描述符
es5:有一個方法 Object.defineProperties(obj, descriptors)
var book_13 = {}; Object.defineProperties(book_13, { _year: { // 數據屬性 value: 2015, writable: true }, name: { // 數據屬性 value: 'book', writable: true }, year: { // 訪問器屬性 set: function(value) {}, get: function() {} } })
4. 獲取屬性的特性描述符
不管是數據屬性還是訪問器屬性都可以通過: Object.getOwnPropertyDescriptor( obj, prop) 獲取
var descriptor1 = Object.getOwnPropertyDescriptor(book_13, 'name'); var descriptor2 = Object.getOwnPropertyDescriptor(book_13, 'year'); console.log(descriptor1) console.log(descriptor2)
文章列表
全站熱搜