属性描述

Object.defineProperty(obj,prop,descriptor)
//obj要定义属性的对象,
//prop要定义或修改的属性的名称或Symbol,
//descriptor要定义或修改的属性描述符

方法会直接在对象上定义一个新属性,或者修改一个对象的相应属性,并返回此对象。

数据描述符

[[Configurable]]
//当直接在一个对象上定义某个属性时,此属性的[[Configurable]]为true;
//当我们通过属性描述符定义一个属性时,这个属性的[[Configurable]]默认为false

表示属性是否可以通过delete删除属性,是否可以修改的它的特性,或者是否可以将它修改为存取属性描述符。

let obj ={
    name:'why',
    age:18,
}
Object.defineProperty(obj,'name',{
    configurable:false,
})
delete obj.name;//此处的name没有被删除
[[Enumerable]]
//当直接在一个对象上定义某个属性时,此属性的[[Enumerable]]为true;
//当我们通过属性描述符定义一个属性时,这个属性的[[Enumerable]]默认为false

表示属性是否可以通过for-in或者Object-keys()返回属性;

[[Writable]]
//当直接在一个对象上定义某个属性时,此属性的[[Writable]]为true;
//当我们通过属性描述符定义一个属性时,这个属性的[[Writable]]默认为false

表示是否可以修改属性的值;

存取属性描述符

监听获取和设置对象属性时,执行回调函数。

Object.defineProperty(obj,"name",{
	set:function(value){
	
	},
	get:function(){
	
	}
})

多个属性进行描述时

Object.defineProperties(obj,{
    name:{
        configurable:false,
    },
    age:{
        writable:false;
    }
})

获取对象属性、属性描述符

Object.getOwnPropertyDescriptors(obj)//获取对象属性描述符
Object.getOwnPropertyNames(obj)//获取对象属性名

//阻止扩展
Object.preventExtensions(obj)
//密封对象(不能进行配置)
Object.seal(obj)
//冻结(不能进行修改)
Object.freeze(obj)