严格模式不改变原型链结构,但通过强化约束使访问更确定可控;推荐用Object.getPrototypeOf()获取原型,禁用__proto__;设置原型须用Object.setPrototypeOf()或Object.create();防范污染应使用Object.create(null)并显式调用原型方法。

严格模式本身不改变原型链的结构或访问方式,但它通过强化执行约束,让原型链的访问行为更确定、更可控——关键在于“避免隐式错误”和“暴露潜在风险”,而不是提供新 API。
用标准方法读取原型,不碰 __proto__
Object.getPrototypeOf(obj) 是唯一推荐的获取原型的方式。它在严格与非严格模式下行为一致,返回 null 表示链已到尽头,不会因对象被冻结或原型被篡改而意外报错或返回 undefined。
- 避免使用 obj.__proto__:它在严格模式下虽可读,但赋值可能失败(如旧版 Safari),且是非标准属性,未来兼容性无保障
- 不要依赖 constructor.prototype 反推实例原型:构造函数可能被重写,constructor 属性也可被修改,不可靠
属性查找时明确区分自有与继承
严格模式下,obj.hasOwnProperty(prop) 和 prop in obj 的语义不变,但配合严格调用能防止因 this 错位导致的误判。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 检查自有属性:用 Object.hasOwn(obj, prop)(ES2022+)或 Object.prototype.hasOwnProperty.call(obj, prop),避免对象自身覆盖了 hasOwnProperty 方法
- 检查是否在原型链上存在:直接用 prop in obj 即可,它天然包含继承路径;若需定位具体在哪一层定义,需手动遍历 Object.getPrototypeOf 链
- 注意:in 操作符对 inenumerable 属性也返回 true,如 Object.prototype.toString,这点与 hasOwnProperty 不同
设置原型必须显式、可检测、有降级
Object.setPrototypeOf(obj, proto) 是严格模式下唯一合规的修改方式。它会在对象被冻结时抛出 TypeError,这反而是优势——让你立刻知道操作被阻止,而不是静默失败。
立即学习“Java免费学习笔记(深入)”;
- 禁止给 null 原型对象设新原型:Object.setPrototypeOf({}, null) 合法;但再 set 一次会失败,因为 null 原型对象没有 [[Prototype]] 可更新
- 创建新对象优先用 Object.create(proto, descriptors):一次性设定原型和自有属性,避免后续修改带来的不确定性
- 若需兼容老旧环境且不能用 Object.create,可用 Object.assign({}, source) + 显式挂载方法,绕过原型链依赖
防范原型污染的关键习惯
严格模式不会自动防御原型污染,但它让污染更难成功、更容易暴露。
- 所有配置对象、映射表、路由规则等,统一用 Object.create(null) 创建,彻底切断与 Object.prototype 的连接
- 若代码依赖 toString() 或 hasOwnProperty() 等原型方法,改用 Object.prototype.toString.call(obj) 这类显式调用,避免被污染后覆盖
- 启用严格模式后,delete Object.prototype.admin 会立即报错,而非静默忽略——这是你发现污染尝试的第一道警报

















