object.hasown 比 hasownproperty 更安全稳定,因其为静态方法,不依赖目标对象的运行时状态(如属性覆盖、原型链污染或 null/undefined 输入),而 hasownproperty 是实例方法,执行受对象自身及原型链状态影响。

Object.hasOwn 和 hasOwnProperty 的执行上下文差异,核心不在“上下文”本身(比如 this 绑定或作用域链),而在于**调用路径是否依赖目标对象的运行时状态**——这直接决定了它们在不同执行环境下的行为稳定性和安全性。
调用主体与上下文依赖完全不同
hasOwnProperty 是实例方法,必须通过对象调用(obj.hasOwnProperty(key))。它的执行依赖三个上下文要素:
- 目标对象 obj 是否拥有可访问的 hasOwnProperty 属性(可能被覆盖、设为 null 或 undefined)
- 对象的原型链是否完整(Object.create(null) 时原型为空,调用直接报错)
- 全局 Object.prototype 是否被污染(如 Object.prototype.hasOwnProperty = () => false)
一旦其中任一环节异常,执行就会中断或返回错误结果——这不是代码写错,而是执行上下文被外部篡改所致。
Object.hasOwn 是静态方法,完全脱离目标对象上下文
Object.hasOwn(obj, key) 的执行不查 obj 的任何属性或原型,它内部硬编码调用原始的 Object.prototype.hasOwnProperty 实现,相当于:
- 跳过 obj 上所有可能的同名方法
- 绕过 obj 的原型链查找过程
- 对 null/undefined 输入直接返回 false,不触发 TypeError
它的执行上下文只依赖 Object 构造函数自身的内部状态,与用户传入的 obj 无关。即使 obj 是恶意构造的(如 { hasOwnProperty: /x/.test }),也不会影响判断逻辑。
实际执行表现对比
以下场景下两者行为明显不同:
- Object.create(null) 对象:hasOwnProperty 调用报错;Object.hasOwn 正常返回 true/false
- obj = { hasOwnProperty: () => true }:hasOwnProperty 总是返回 true;Object.hasOwn 按真实属性存在性返回
- Object.prototype.hasOwnProperty = null:所有 obj.hasOwnProperty() 失效;Object.hasOwn 仍正常工作
- obj = null:hasOwnProperty 报错;Object.hasOwn 安全返回 false
这些不是边界 case,而是 SSRF、模板注入等漏洞链中真实出现的攻击面。
不需要手动管理 this 或 call 绑定
为规避 hasOwnProperty 的风险,开发者常写 Object.prototype.hasOwnProperty.call(obj, key) ——这本质是强行指定执行上下文(this 指向 obj),但依然依赖 Object.prototype.hasOwnProperty 未被污染。Object.hasOwn 则一步到位,无需任何上下文干预,参数直传即用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











