文章出處

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)

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()