JS—对象中的Object.defineProperty( )

46 阅读2分钟

Object.defineProperty( )

1.概述

Object.defineProperty()用于直接在一个对象上定义一个新属性,或修改一个现有属性,并返回该对象。

2.语法

Object.defineProperty(obj,prop,descriptor)

1)参数

obj——要定义属性的当前对象。

prop——要定义或修改的属性的名称。

descriptor——要定义或修改的属性描述符。对象里目前存在的属性描述符有两种主要形式:数据描述符存取描述符

2)返回值

返回一个被传递给函数的对象。

3.描述

数据描述符

数据描述符是一个具有值的属性,该值可以是 可写 / 不可写的。

存取描述符

存取描述符是由 getter 函数和 setter 函数所描述的属性。

3.示例

1).创建属性:如果对象中不存在指定的属性,Object.defineProperty() 会创建这个属性。

//创建一个新对象
const user = {}

//在对象中添加一个属性与数据描述符
Object.defineProperty(user,'age',{
    value:18,
    writable:true,
    enumerable : true,
    configurable : true
});

console.log(user.age);  //18;对象user拥有了属性age,值为18

//设置值
user.age=25
console.log(user.age);  //25

//在对象中添加一个设置了存取描述符属性
const temp=20
Object.defineProperty(user,'newAge',{
    get() {
        //当获取值的时候触发的函数
        return temp
    },
    set(val) {
        //当设置值的时候触发的函数,设置的新值通过参数value拿到
        temp = val;
    },
    enumerable : true,
    configurable : true
});

//获取值
console.log(user.newAge);  //20; 对象user拥有了属性newAge,值为20

注意:

1.数据描述符和存取描述符不能混合使用

2.当使用了getter或setter方法,不允许使用writable和value这两个属性

2).修改属性

  • Writable 属性

writable 设置为 false 时,该属性是不可写的,不能被重新赋值。

const person={};
Object.defineProperty(person,'age',{
    age:18,
    writable:false  // writable默认为false,不允许修改person的age属性值
});
person.age=20;
console.log(person.age);  //18

writable 设置为 true 时,该属性可写,能被重新赋值。

const person={};
Object.defineProperty(person,'age',{
    age:18,
    writable:true  // writable: 允许修改person的age属性值
});
person.age=20;
console.log(person.age);  //20
  • Enumerable 属性

Configurable 属性表示属性是否能在for...in 或者 Object.keys()遍历中被枚举

  • Configurable 属性

Configurable 属性表示对象的属性是否可以被删除