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

js