一、对象属性由下面特性组成的:
value
该属性的值(仅针对数据属性描述符有效)
writable
当且仅当属性的值可以被改变时为true。(仅针对数据属性描述有效)
get
获取该属性的访问器函数(getter)。如果没有访问器, 该值为undefined。(仅针对包含访问器或设置器的属性描述有效)
set
获取该属性的设置器函数(setter)。 如果没有设置器, 该值为undefined。(仅针对包含访问器或设置器的属性描述有效)
configurable
当且仅当指定对象的属性描述可以被改变或者属性可被删除时,为true。
enumerable
当且仅当指定对象的属性可以被枚举出时,为 true。
二、属性分为两种类型:1数据属性 2访问器属性。
1.怎样知道这个属性到底是数据属性还是访问器属性?
利用Object.getOwnPropertyDescriptor(obj,“属性名”)获取一个对象的属性的特性,该方法会返回一个对象,
当是访问器属性时,该对象属性有enumerable,configurable,get,set。
当是数据属性,该对象属性有value,writable,enumerable,configurable。
//数据属性
const object1 = {
property1: 42
};
const descriptor1 = Object.getOwnPropertyDescriptor(object1, 'property1');
console.log(descriptor1);//Object { value: 42, writable: true, enumerable: true, configurable: true }
//访问器属性
const descriptor2=Object.getOwnPropertyDescriptor(window,'name')
console.log(descriptor2);//Object { get: function get name() { [native code] }, set: function set name() { [native code] }, enumerable: true, configurable: true }
三、修改或添加对象属性特性
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
//添加数据属性
const object1 = {};
Object.defineProperty(object1, 'property1', {
value: 42,
writable: true
});
object1.property1 = 77;
console.log(object1.property1);//77
//添加访问器属性
const object2 = {};
Object.defineProperty(object2,'haha',{
get(){
return 22
}
})
console.log(object2.haha);//22
网友评论