js实现defineProperty
使用 Object.defineProperty 实现属性定义
Object.defineProperty 是 JavaScript 中用于直接在对象上定义新属性或修改现有属性的方法。它允许精确控制属性的行为,如可枚举性、可配置性和可写性。
语法:
Object.defineProperty(obj, prop, descriptor)
obj:要定义属性的对象。prop:要定义或修改的属性的名称或Symbol。descriptor:要定义或修改的属性描述符。
属性描述符的配置选项
属性描述符分为两种类型:数据描述符和存取描述符。两者不能混合使用。
数据描述符:
value:属性的值,默认为undefined。writable:如果为true,属性的值可以被修改,默认为false。enumerable:如果为true,属性会在枚举对象属性时出现,默认为false。configurable:如果为true,属性的类型可以被改变且属性可以从对象中删除,默认为false。
存取描述符:
get:属性的 getter 函数,默认为undefined。set:属性的 setter 函数,默认为undefined。enumerable和configurable同上。
示例代码
1. 定义普通属性
const obj = {};
Object.defineProperty(obj, 'name', {
value: 'Alice',
writable: true,
enumerable: true,
configurable: true
});
console.log(obj.name); // 输出: Alice
2. 定义不可写属性
const obj = {};
Object.defineProperty(obj, 'age', {
value: 25,
writable: false
});
obj.age = 30; // 静默失败,严格模式下会抛出错误
console.log(obj.age); // 输出: 25
3. 定义 getter 和 setter
const obj = {};
let _value = 0;
Object.defineProperty(obj, 'count', {
get() {
return _value;
},
set(newValue) {
_value = newValue;
},
enumerable: true,
configurable: true
});
obj.count = 10;
console.log(obj.count); // 输出: 10
4. 定义不可枚举属性

const obj = { name: 'Bob' };
Object.defineProperty(obj, 'id', {
value: 1,
enumerable: false
});
console.log(Object.keys(obj)); // 输出: ['name']
注意事项
- 如果省略描述符的某些字段,它们会默认为
false或undefined。 - 尝试修改不可配置属性的描述符会抛出错误。
- 在严格模式下,对不可写属性赋值会抛出错误。
通过 Object.defineProperty,可以灵活地控制对象属性的行为,适用于需要精细控制属性访问和修改的场景。






