Object.preventExtensions()仅阻止对象自身添加新属性,不影响原型链操作;可修改/删除已有属性,也可自由操作__proto__、prototype及原型属性。

可以使用 Object.preventExtensions() 阻止向对象添加新自身属性,但该方法**完全不影响原型链的操作**——包括修改对象的 __proto__、替换 prototype(对函数而言),或给原型对象添加/修改属性。这是设计使然:它只封禁“在该对象上定义新自有属性”,不干涉原型继承机制。
preventExtensions 只作用于对象自身
调用后,对象不能再通过赋值(obj.newProp = value)、Object.defineProperty 或解构扩展等方式新增自有属性;但已有属性仍可读写删除,原型链也完全开放:
-
obj.existing = 'ok'✅ 允许(修改已有属性) -
delete obj.existing✅ 允许(删除已有属性) -
obj.__proto__.shared = 'from proto'✅ 允许(修改原型) -
Object.getPrototypeOf(obj).newOnProto = true✅ 允许 -
obj.newProp = 123❌ 报错(严格模式)或静默失败(非严格)
函数实例与 prototype 的关系不受影响
对构造函数来说,preventExtensions 作用于其实例,而非其 prototype 对象本身。因此你可以随时修改原型:
function Person() {}
const p = new Person();
Object.preventExtensions(p);
// ✅ 完全合法:修改 Person.prototype
Person.prototype.sayHi = function() { return 'hi'; };
console.log(p.sayHi()); // 'hi' —— 继承自原型,不受限制
// ✅ 也可直接改 p 的原型(不推荐但可行)
p.__proto__.age = 30;
console.log(p.age); // 30
若想限制原型修改,需单独处理原型对象
preventExtensions 不会自动保护原型。如需禁止向原型添加属性,必须显式对其原型对象调用:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
-
Object.preventExtensions(Person.prototype)→ 禁止再往Person.prototype加属性 -
Object.seal(Person.prototype)→ 进一步禁止删除和配置变更 -
Object.freeze(Person.prototype)→ 最强防护:不可增删改,属性值也不可变(浅冻结)
注意:这些操作只影响目标对象(如 Person.prototype),不会波及实例 p 自身的扩展性控制。
常见误区提醒
不要混淆以下概念:
-
__proto__是实例的内部原型引用,可读写(现代推荐用Object.getPrototypeOf/Object.setPrototypeOf) -
prototype是函数对象的属性,用于新建实例时设置__proto__,仅函数有 -
preventExtensions不改变原型链结构,也不阻止Object.create(null)等创建无原型对象

















