Object.defineProperty()
Object.defineProperty()方法会直接在一个对象上面定义(添加)一个新的属性,或者修改一个现有的属性,并返回此对象。
语法:Object.defineProperty(要定义属性的对象, 要定义或修改的属性的名称, 要定义或修改的属性描述符)
let obj = {};
Object.defineProperty(obj, 'name', {
value: '张三',
writable: false
})
通过赋值操作添加对象的属性是可以枚举的,可以改变对象属性的值,也可以删除对象的属性。
let obj={};
obj.name='张三';
obj.age=29;
delete obj.name;
console.log(obj); //{age:29}
但是注意在默认情况下,使用Object.defineProperty()方法添加的属性值是不能更改的。我们可以更改配置,让它允许修改属性值。
描述符分 数据描述符 和 存取描述符
以下是两个描述符共有的设置:
-
configurable
当且仅当该属性的 configurable 键值为 true 时,该属性的描述符才能够被改变,同时该属性也能从对应的对象上被删除。
默认为 false。 -
enumerable
当且仅当该属性的 enumerable 键值为 true 时,该属性才会出现在对象的枚举属性中。
默认为 false。
属性描述符配置:
- value
该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。
默认为 undefined。 - writable
当且仅当该属性的 writable 键值为 true 时,属性的值,也就是上面的 value,才能被赋值运算符 (en-US)改变。
默认为 false。
存取描述符配置:
- get
属性的 getter 函数,如果没有 getter,则为 undefined。当访问该属性时,会调用此函数。执行时不传入任何参数,但是会传入 this 对象(由于继承关系,这里的this并不一定是定义该属性的对象)。该函数的返回值会被用作属性的值。
默认为 undefined。 - set
属性的 setter 函数,如果没有 setter,则为 undefined。当属性值被修改时,会调用此函数。该方法接受一个参数(也就是被赋予的新值),会传入赋值时的 this 对象。
默认为 undefined。
注意,存取描述符和数据描述符的配置不可以混用
详细讲解请看mdn