writable
特性
- 对属性赋值的影响:如果
writable
为true
,可以对属性进行赋值操作;如果为false
,尝试对该属性赋值时,在非严格模式下不会报错,但赋值无效,在严格模式下会抛出错误。
- 对删除操作的影响:
writable
特性本身不直接影响删除操作,删除操作主要受configurable
特性影响。
- 对遍历操作的影响:
writable
特性不影响属性的遍历。
- 示例:
const obj = {};
Object.defineProperty(obj, 'prop', {
value: 10,
writable: false
});
// 非严格模式下,赋值无效但不报错
obj.prop = 20;
console.log(obj.prop); // 输出 10
// 严格模式下
'use strict';
const strictObj = {};
Object.defineProperty(strictObj, 'prop', {
value: 10,
writable: false
});
// 尝试赋值会抛出TypeError
strictObj.prop = 20;
configurable
特性
- 对属性赋值的影响:
configurable
特性本身不直接影响属性赋值操作,主要由writable
决定能否赋值。
- 对删除操作的影响:如果
configurable
为true
,可以使用delete
操作符删除该属性;如果为false
,在非严格模式下删除操作不报错但不会删除属性,在严格模式下会抛出错误。
- 对遍历操作的影响:如果
configurable
为false
,使用Object.defineProperty
重新定义该属性时,不能修改其可枚举性(enumerable
)、可配置性(configurable
)以及数据描述符的value
和writable
特性(访问器描述符有不同规则)。这间接影响到后续遍历,因为如果不能修改enumerable
,就无法改变属性是否出现在遍历中。
- 示例:
const obj = {};
Object.defineProperty(obj, 'prop', {
value: 10,
configurable: false
});
// 非严格模式下,删除操作不报错但属性不会被删除
delete obj.prop;
console.log(obj.prop); // 输出 10
// 严格模式下
'use strict';
const strictObj = {};
Object.defineProperty(strictObj, 'prop', {
value: 10,
configurable: false
});
// 尝试删除会抛出TypeError
delete strictObj.prop;
enumerable
特性
- 对属性赋值的影响:
enumerable
特性不影响属性的赋值操作。
- 对删除操作的影响:
enumerable
特性不直接影响删除操作。
- 对遍历操作的影响:如果
enumerable
为true
,属性会出现在for...in
循环、Object.keys()
以及JSON.stringify()
等遍历操作中;如果为false
,则不会出现在这些遍历操作中,但仍可通过直接访问属性名来访问该属性。
- 示例:
const obj = {};
Object.defineProperty(obj, 'prop1', {
value: 10,
enumerable: true
});
Object.defineProperty(obj, 'prop2', {
value: 20,
enumerable: false
});
for (let key in obj) {
console.log(key); // 只会输出 'prop1'
}
console.log(Object.keys(obj)); // 输出 ['prop1']
console.log(obj.prop2); // 仍可访问,输出 20