js实现defineProperty
实现 defineProperty 的基本方法
在 JavaScript 中,Object.defineProperty() 方法用于直接在对象上定义新属性,或修改现有属性,并返回该对象。该方法接受三个参数:目标对象、属性名称和属性描述符。
const obj = {};
Object.defineProperty(obj, 'propertyName', {
value: 42,
writable: false,
enumerable: true,
configurable: true
});
console.log(obj.propertyName); // 42
obj.propertyName = 100; // 静默失败,严格模式下会抛出错误
console.log(obj.propertyName); // 42
属性描述符的配置选项
属性描述符分为数据描述符和存取描述符,两者不能混合使用。数据描述符包含 value 和 writable,而存取描述符包含 get 和 set。

数据描述符示例:

Object.defineProperty(obj, 'dataProp', {
value: 'hello',
writable: true, // 是否可修改
enumerable: true, // 是否可枚举(如出现在 for...in 循环中)
configurable: true // 是否可删除或修改属性描述符
});
存取描述符示例:
let internalValue = 0;
Object.defineProperty(obj, 'accessorProp', {
get() {
return internalValue;
},
set(newValue) {
internalValue = newValue * 2;
},
enumerable: true,
configurable: true
});
obj.accessorProp = 10;
console.log(obj.accessorProp); // 20
批量定义属性
使用 Object.defineProperties() 可以一次性定义多个属性:
Object.defineProperties(obj, {
prop1: {
value: true,
writable: true
},
prop2: {
value: 'World',
writable: false
}
});
注意事项
- 如果
configurable为false,则不能更改除writable和value之外的属性描述符特性。 - 在严格模式下,尝试修改不可写属性或删除不可配置属性会抛出错误。
- 使用
get和set时,不能同时指定value或writable。






