object.hasown(obj, key) 安全替代 obj.hasownproperty(key),不依赖原型链、支持 null 原型对象、明确报错非法参数,es2022 标准方法,兼容方案用 object.prototype.hasownproperty.call(object(obj), key)。

直接用 Object.hasOwn(obj, key) 替代 obj.hasOwnProperty(key),就能避开原型链被篡改、方法被覆盖或对象无原型带来的运行时风险。它不读取对象原型,也不调用可能被污染的实例方法,只检查对象自身属性描述符。
为什么旧版 hasOwnProperty 容易出问题
hasOwnProperty 是挂载在 Object.prototype 上的实例方法,一旦原型被修改(比如 Object.prototype.hasOwnProperty = () => false),所有普通对象调用它都会返回错误结果;更常见的是:
- 对象自身定义了同名属性,如
{ hasOwnProperty: null },调用直接报错 - 使用
Object.create(null)创建的对象根本没有这个方法,调用即TypeError - 第三方库或用户输入对象可能已重写该方法,导致白名单校验、配置过滤等逻辑静默失效
Object.hasOwn 的安全优势
它是 ES2022 正式引入的静态方法,从底层绕过原型链干扰:
- 不依赖目标对象的原型,哪怕
Object.prototype被污染,结果依然准确 - 支持
Object.create(null)对象,开箱即用 - 对
null或undefined第一个参数会明确抛出TypeError(这是规范行为,便于及时发现传参错误) - 检测
Symbol属性时必须传原始值(如const sym = Symbol('x'); Object.hasOwn(obj, sym)),不会因字符串误传而静默失败
替换时的关键操作细节
不是简单全局替换字符串,需注意行为一致性:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 第一个参数必须是对象类型,不能是
null或undefined(若业务允许空值,应提前判空) - 不再需要
.call绑定,告别Object.prototype.hasOwnProperty.call(obj, 'x')这类冗长写法 - 不要和
in混用:Object.hasOwn只查自身属性,in查整个原型链——后者在原型污染后可能意外返回true,更危险
兼容旧环境的稳妥降级方案
现代环境(Chrome 93+、Firefox 97+、Safari 16.4+、Node.js 16.9+)已原生支持。若需支持更早版本,推荐以下 polyfill:
const hasOwn = Object.hasOwn || ((obj, key) => Object.prototype.hasOwnProperty.call(Object(obj), key));
关键点在于:Object(obj) 将 null 或 undefined 转为空对象,避免调用时报错;且不直接引用 obj.hasOwnProperty,彻底规避原型污染影响。










