一、定义新属性与其描述符
-
Object.defineProperty(o, propName, descriptor)
定义单个属性(1) 描述符可拥有的键值
描述符 configurable enumerable value writable get set 数据描述符 √ √ √ √ X X 存取描述符 √ √ X X √ √ (2) 示例
let o = { }; // 数据描述符属性 Object.defineProperty(o, 'data1', { configurable: true, enumerable: true, writable: true, value: 10 }) // 存取描述符属性 let data2Key = Symbol('data2'); Object.defineProperty(o, 'data2', { configurable: true, enumerable: true, set: function(_value) { // 此处最好不要用箭头函数,避免数据注入到window中 this[data2Key]= _value; }, get: function() { return this[data2Key]; } })
(3)
configurable: false
- 该属性不能在数据描述符和存取描述符间切换
- 允许define一个描述符一模一样的
- 允许
writable
从true修改为false writable: true
时允许修改value
(4)
writable: false
let o = { }; Object.defineProperty(o, 'data', { writable: false, value: 10 }) // 修改o.data不会抛出错误,但修改无法完成 o.data = 11; // no error throw console.log(o.data); // 10
(5) 一个属性的描述符不能同时是数据描述符与存取描述符。换言之,一个属性的描述符中不能同时设置了(
value
,writable
) 与 (get
,set
) -
Object.defineProperties(o, props)
定义多个属性props: { prop1: { configurable: false, ... } }
二、 获取属性的描述符
// 测试数据定义
let symbolKey = Symbol('symbolKey');
function Obj(){
this.ownKey = 1;
this[symbolKey] = 2;
}
Obj.prototype.prototypeKey = 3;
let o = new Obj();
Object.defineProperty(o, 'unenumerableKey', {
enumerable: false,
value: 4
})
-
Object.getOwnPropertyDescriptor(o, prop)
获取对象单个本地属性的描述符Object.getOwnPropertyDescriptor(o, symbolKey); // {value: 2, writable: true, enumerable: true, configurable: true}
-
Object.getOwnPropertyDescriptors(o)
获取对象全部本地属性的描述符Object.getOwnPropertyDescriptor(o); /* { ownKey: {value: 1, writable: true, enumerable: true, configurable: true} unenumerableKey: {value: 4, writable: false, enumerable: false, configurable: false} Symbol(symbolKey): {value: 2, writable: true, enumerable: true, configurable: true} } */