JavaScript Object.defineProperty()总结
·
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
更多推荐
所有评论(0)