javascript 属性描述符(descriptor)

一、定义新属性与其描述符

  1. 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

    1. 该属性不能在数据描述符和存取描述符间切换
    2. 允许define一个描述符一模一样的
    3. 允许writable 从true修改为false
    4. 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)

  2. 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
})
  1. Object.getOwnPropertyDescriptor(o, prop) 获取对象单个本地属性的描述符

    Object.getOwnPropertyDescriptor(o, symbolKey);
    // {value: 2, writable: true, enumerable: true, configurable: true}
    
  2. 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}
    }
    */
    

猜你喜欢

转载自blog.csdn.net/SJ1551/article/details/109288803