淺談 JS 對象屬性描述符(property descriptor)對象

JavaScript.jpg

屬性描述符(property descriptor)對象

  • value:就是屬性的值,默認 undefined
  • writable:決定屬性可否被賦值
  • get:訪問器函數(getter),函數或 undefined,在取屬性值時被調用
  • set:設置器函數(setter),函數或 undefined,在設置屬性值時被調用
  • enumerable:決定 for in 或 Object.keys 可否枚舉該屬性
  • configurable:決定該屬性可否被刪除,以及除 value 和 writable 外的其餘特性是否能夠被修改

數據描述符

value, writable, enumerable, configurable函數

存取描述符

get, set, enumerable, configurable性能

若是一個描述符不具備value,writable,get 和 set 任意一個關鍵字,那麼它將被認爲是一個數據描述符。
若是一個描述符同時有(value或writable)和(get或set)關鍵字,將會產生一個異常。

相關方法

Object.defineProperty(obj, prop, descriptor)

Object.defineProperties(obj, props)this

Object.getOwnPropertyDescripter(obj, prop)spa

Object.getOwnPropertyDescripters(obj)code

let obj2 = {
    _name: 'zty',
    get name() {
        return this._name
    },
    set name(name) {
        this._name = name + '1'
    }
}

obj2.name  // "zty"
obj2.name = 'zzx'
obj2.name  // "zzx1"

Object.getOwnPropertyDescriptor(obj2, 'name')
{
    configurable: true,
    enumerable: true,
    get: ƒ name(),
    set: ƒ name(name)
}
Object.getOwnPropertyDescriptor(obj2, '_name')
{
    configurable: true,
    enumerable: true,
    value: "zzx1",
    writable: true
}
Object.getOwnPropertyDescriptors(obj2)
{
    name: {
        configurable: true,
        enumerable: true,
        get: ƒ name(),
        set: ƒ name(name)
    },
    _name: {
        configurable: true,
        enumerable: true,
        value: "zzx1",
        writable: true
    }
}
若是對象屬性由 Object.defineProperty(obj, 'key', descriptor) 定義,則 writable, enumerable, configurable 默認均爲 false
若是對象屬性由 obj.key = 'value' 定義,則 writable, enumerable, configurable 均爲 true
let obj = {}
obj.key1 = 'value1'
let descriptor = Object.create(null)
descriptor.value = 'value2'
Object.defineProperty(obj, 'key2', descriptor)
Object.getOwnPropertyDescriptors(obj)
{
    key1: {value: "value1", writable: true, enumerable: true, configurable: true},
    key2: {value: "value2", writable: false, enumerable: false, configurable: false}
}

// 也就是說
o.a = 1;
// 等同於 :
Object.defineProperty(o, "a", {
  value : 1,
  writable : true,
  configurable : true,
  enumerable : true
});

// 另外一方面,
Object.defineProperty(o, "a", { value : 1 });
// 等同於 :
Object.defineProperty(o, "a", {
  value : 1,
  writable : false,
  configurable : false,
  enumerable : false
});
相關文章
相關標籤/搜索