object.preventextensions 的核心作用是禁止对象添加新属性,但允许读写删除已有属性;其通过将内部[[extensible]]标志设为false实现,非严格模式下静默失败,严格模式下抛typeerror。

Object.preventExtensions 的核心作用就是“封口”——让对象不能再添加任何新属性,但对已有属性的读、写、删除完全不干涉。
它怎么阻止新增属性?
调用 Object.preventExtensions(obj) 后,JavaScript 引擎会把该对象的内部 [[Extensible]] 标志设为 false。此后所有尝试向该对象自身添加新属性的操作,都会被拦截:
- 非严格模式下:静默失败,赋值无效,也不报错(比如
obj.newProp = 123不起作用) - 严格模式下:直接抛出
TypeError(例如"Cannot add property newProp, object is not extensible") - 使用
Object.defineProperty添加新属性也会失败(无论是否严格模式)
它不管什么?这些操作依然有效
这个方法只管“加新”,其他都放行:
- 修改已有属性的值(
obj.existing = 'new')✅ - 删除已有属性(
delete obj.existing)✅(前提是该属性configurable: true) - 访问原型链上的属性(
obj.prototypeMethod())✅ - 给原型对象添加属性(
MyClass.prototype.newMethod = ...)✅(实例仍能继承)
怎么确认对象已被锁定?
用 Object.isExtensible(obj) 检查:
- 返回
true→ 还能加属性 - 返回
false→ 已被preventExtensions或更严格的seal/freeze锁定
注意:传入原始值(如字符串、数字)或 null/undefined 会抛错,必须是对象类型。
常见误区提醒
- 它不递归:只保护目标对象本身,嵌套对象(如
obj.nested)照常可扩展 - 它不可逆:一旦调用,无法恢复成可扩展状态
- 它不限制原型:想禁掉往
Constructor.prototype加东西,得单独对原型调用preventExtensions
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











