Object.hasOwn是ES2022引入的安全替代方案,可直接检测对象自有属性,不依赖原型链,兼容Object.create(null)对象,且不受hasOwnProperty被重写或缺失的影响。

hasOwnProperty 不会直接报错,但会**找不到方法**,因为 Object.create(null) 创建的对象没有原型链,自然也不继承 Object.prototype 上的 hasOwnProperty 方法。
为什么调用会失败?
普通对象(如 {} 或 Object.create(Object.prototype))的原型是 Object.prototype,所以能访问到 hasOwnProperty。而 Object.create(null) 创建的是“纯字典对象”,其 __proto__ 为 null,没有任何继承方法。
如果直接写 obj.hasOwnProperty('key'),运行时会抛出 TypeError: obj.hasOwnProperty is not a function。
安全调用 hasOwnProperty 的三种方式
- 用 Object.prototype.hasOwnProperty.call(obj, key):最通用、推荐。绕过实例查找,直接借用原型方法。
-
用 Object.hasOwn(obj, key)(ES2022+):现代替代方案,专为此类场景设计,支持
Object.create(null)对象,且更语义清晰。 -
先检查方法是否存在(不推荐):比如
typeof obj.hasOwnProperty === 'function' && obj.hasOwnProperty(key),但冗余且无法解决根本问题。
实际写法对比
假设 const obj = Object.create(null); obj.name = 'Alice';:
✅ 正确:Object.prototype.hasOwnProperty.call(obj, 'name') → trueObject.hasOwn(obj, 'name') → true(需环境支持)
❌ 错误:obj.hasOwnProperty('name') → 报错
建议优先使用 Object.hasOwn
只要运行环境支持(Node.js ≥16.9 / Chrome ≥93 / Firefox ≥92 / Safari ≥15.4),Object.hasOwn 是更简洁、更健壮的选择。它内部做了适配,不会依赖对象原型,也避免了 call 的样板代码。对老旧环境,回退到 Object.prototype.hasOwnProperty.call 即可。


















