JavaScript Object.defineProperty()总结

概述

Object.defineProperty() 是 JavaScript 中用于精准控制对象属性的方法。它允许你定义或修改对象的单个属性,并可以设置该属性的各种特性。

语法

Object.defineProperty(obj, prop, descriptor)
  • obj:操作的目标对象
  • prop:操作的属性名
  • descriptor:属性特性配置

属性描述符分2种类型:

  • 数据描述符:用于描述有具体值的属性
    • value:类型 any,默认值 undefined,属性的具体值
    • writable:类型 boolean,默认值 false,属性值是否可修改
    • enumerable:类型 boolean,默认值 false,属性是否可枚举(是否能通过 for…in 或 Object.keys() 遍历)
    • configurable:类型 boolean,默认值 false,属性是否可配置(是否能修改描述符或删除属性)
  • 访问器描述符:用于描述通过 getter/setter 访问的属性
    • get:类型 function,默认值 undefined,读取属性时调用
    • set:类型 function,默认值 false,设置属性时调用
    • enumerable:类型 boolean,默认值 false,属性是否可枚举
    • configurable:类型 boolean,默认值 false,属性是否可配置(是否能修改描述符或删除属性)

数据描述符和访问权描述符不能同时使用,否则抛出 TypeError。

用法

定义数据属性

const user = {};

Object.defineProperty(user, "name", {
    value: "小明",
    writable: true,
    enumerable: true,
    configurable: true,
});

console.log(user); // { name: '小明' }

定义只读属性

const user = {};

Object.defineProperty(user, "name", {
    value: "小明",
    writable: false,
});

console.log(user.name); // 小明
user.name = "小黑";
console.log(user.name); // 小明

定义不可枚举属性

const user = {};

Object.defineProperty(user, "name", {
    value: "小明",
    enumerable: false,
});

const keys = Object.keys(user);
console.log(keys); // []

for (let key in user) {
    console.log(key);
}
// 无输出

定义不可配置属性

const user = {};

Object.defineProperty(user, "age", {
    value: 20,
    configurable: false
});

delete user.age;
console.log(user.age); // 20

try {
    Object.defineProperty(user, "age", {
        value: 30
    });
} catch (e) {
    console.error(e.message); // Cannot redefine property: age
}

定义访问器属性

const user = {
    _age: 20
};

Object.defineProperty(user, "age", {
    get() {
        console.log("getter");
        return this._age;
    },
    set(newVal) {
        console.log("setter");
        if (newVal >= 0 && newVal <= 120) {
            this._age = newVal;
        } else {
            console.error("年龄必须在0~120");
        }
    }
});

console.log(user.age);
user.age = 25;
console.log(user.age);
user.age = -1;

// getter
// 20
// setter
// getter
// 25
// setter
// 年龄必须在0~120
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐