- 添加新属性:
- 行为:当尝试为不可扩展的对象添加新属性时,操作不会成功,并且在严格模式下会抛出
TypeError
。在非严格模式下,不会抛出错误,但新属性也不会被添加到对象中。
- 原因:JavaScript通过将对象的
[[Extensible]]
内部属性设置为false
来表示对象不可扩展。当尝试添加新属性时,JavaScript引擎会检查这个属性,如果为false
,则拒绝添加新属性。
- 代码示例:
// 创建一个不可扩展的对象
const obj = {};
Object.preventExtensions(obj);
// 非严格模式下尝试添加新属性
obj.newProp = 'new value';
console.log(obj.newProp); // undefined
// 严格模式下尝试添加新属性
function addPropInStrictMode() {
'use strict';
const obj = {};
Object.preventExtensions(obj);
obj.newProp = 'new value'; // 抛出TypeError
}
// addPropInStrictMode(); // 取消注释会看到TypeError
- 修改现有属性的特性(如configurable、enumerable等):
- 行为:如果属性本身是可配置的(
configurable: true
),那么仍然可以修改其特性。但是如果属性是不可配置的(configurable: false
),则无法修改其特性,在严格模式下会抛出TypeError
,非严格模式下修改操作被忽略。
- 原因:
configurable
特性决定了是否可以修改属性的其他特性(如configurable
、enumerable
、writable
)以及是否可以删除属性。对于不可扩展对象,属性的configurable
特性遵循其原有设置。
- 代码示例:
// 创建一个不可扩展的对象并添加一个可配置属性
const obj1 = {};
Object.preventExtensions(obj1);
obj1.prop1 = 'value1';
Object.defineProperty(obj1, 'prop1', {
configurable: true
});
// 修改可配置属性的enumerable特性
Object.defineProperty(obj1, 'prop1', {
enumerable: false
});
console.log(Object.getOwnPropertyDescriptor(obj1, 'prop1').enumerable); // false
// 创建一个不可扩展的对象并添加一个不可配置属性
const obj2 = {};
Object.preventExtensions(obj2);
obj2.prop2 = 'value2';
Object.defineProperty(obj2, 'prop2', {
configurable: false
});
// 尝试修改不可配置属性的enumerable特性
function modifyNonConfigurableProp() {
'use strict';
Object.defineProperty(obj2, 'prop2', {
enumerable: false
}); // 抛出TypeError
}
// modifyNonConfigurableProp(); // 取消注释会看到TypeError