Object.defineProperty的用法詳解

該方法是es5的方法(千萬不要覺得是es6的哦),做用是直接在一個對象上定義一個新屬性,或者修改一個對象的現有屬性, 並返回這個對象。(切記只能用在對象身上不能用在數組身上es6

一、語法

Object.defineProperty(obj, prop, descriptor)複製代碼

二、參數說明:

  • obj:必需。目標對象 
  • prop:必需。需定義或修改的屬性的名字
  • descriptor:必需。目標屬性所擁有的特性

三、屬性使用案例

修改某個屬性的值時,給這個屬性添加一些特性。typescript

let person = {}; 
Object.defineProperty(person, 'name', {   
    writable: true || false,   
    configurable: true || false,   
    enumerable: true || false,  
    value:'gjf' 
});
複製代碼

屬性詳解:數組

  • writable:是否能夠被重寫,true能夠重寫,false不能重寫,默認爲false。
  • enumerable:是否能夠被枚舉(使用for...in或Object.keys())。設置爲true能夠被枚舉;設置爲false,不能被枚舉。默認爲false。
  • value:值能夠使任意類型的值,默認爲undefined
  • configurable:是否能夠刪除目標屬性或是否能夠再次修改屬性的特性(writable, configurable, enumerable)。設置爲true能夠被刪除或能夠從新設置特性;設置爲false,不能被能夠被刪除或不能夠從新設置特性。默認爲false。

四、存取器描述(get和set)

  • 注意:當使用了getter或setter方法,不容許使用writable和value這兩個屬性

let person = {};
let n = 'gjf';
Object.defineProperty(person, 'name', { 
    configurable: true,  
    enumerable: true, 
    get() {    
        //當獲取值的時候觸發的函數    
        return n  
    },  
    set(val) {    
        //當設置值的時候觸發的函數,設置的新值經過參數val拿到    
        n = val;  
    }
});
console.log(person.name) //gjf
person.name = 'newGjf'
console.log(person.name) //newGif複製代碼
相關文章
相關標籤/搜索