object.hasown能彻底防御原型链污染,因其是不依赖原型链的静态方法,直接调用原始hasownproperty实现检查对象自身属性;对object.create(null)、冻结对象、原型被篡改等场景均稳定有效。

哪些原型链修改对 Object.hasOwn 完全无效?
• 把 Object.prototype.hasOwnProperty = null —— 对 hasOwn 无影响
• 给某个对象自己加 hasOwnProperty: () => false —— hasOwn 不会调用它
• 创建 Object.create(null) 对象 —— hasOwn 可正常检测其自有属性
• 冻结对象并删除/修改属性描述符 —— 只要属性还在对象上,hasOwn 就返回 true
对比:hasOwnProperty 为什么会被原型链破坏?
• 它是实例方法,必须从原型链上查找 —— 链断了或被覆盖,就失效
• obj.hasOwnProperty('x') 实际执行路径依赖 obj 的 __proto__
• 第三方库、恶意输入、调试代码都可能悄悄污染原型,导致校验静默失败
• 即使写成 Object.prototype.hasOwnProperty.call(obj, 'x'),仍受 Object.prototype 被篡改影响
什么时候你该放心用 Object.hasOwn?
• 用户提交的 JSON 做白名单字段过滤
• 配置对象中判断 config.timeout 是否显式设置
• 遍历 for...in 时排除继承属性
• 与 Proxy、Map 转换后的对象做属性存在性判断
注意边界行为
• 传入 null 或 undefined 会直接抛 TypeError(这是规范要求,不是 bug)
• 检测 Symbol 属性时,必须传 Symbol 原始值,不能传字符串描述
• 它只认“自有属性”,'toString' in obj 返回 true 并不代表 Object.hasOwn(obj, 'toString') 也为 true











