object.hasown 是 es2022 新增的静态方法,用于安全判断对象是否自有某属性(含不可枚举属性和 symbol),避免 hasownproperty 被覆盖的问题,返回布尔值,现代浏览器及 node.js 16.9+ 已支持。

Object.hasOwn 是 ES2022(不是 ES6)新增的静态方法,用于准确判断一个对象是否自身拥有某个属性(即该属性存在于对象自身,而非原型链上)。它替代了过去常用但有缺陷的 obj.hasOwnProperty(prop)。
为什么不用 hasOwnProperty?
hasOwnProperty 是继承自 Object.prototype 的方法,如果对象自身恰好定义了一个同名属性(比如 { hasOwnProperty: true }),就会覆盖原型方法,导致调用失败或报错。而 Object.hasOwn 是静态方法,不依赖实例,更安全可靠。
基本用法:传入对象和属性名
语法很简单:
-
Object.hasOwn(obj, prop)—— 第一个参数是目标对象,第二个是字符串形式的属性名(或 Symbol) - 返回布尔值:
true表示该属性是对象自身的(包括不可枚举属性),false表示不存在或仅在原型上
例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const obj = { a: 1 };
Object.setPrototypeOf(obj, { b: 2 });
console.log(Object.hasOwn(obj, 'a')); // true(自有)
console.log(Object.hasOwn(obj, 'b')); // false(来自原型)
console.log(Object.hasOwn(obj, 'toString')); // false(来自 Object.prototype)
支持不可枚举属性和 Symbol 属性
与 for...in 不同,Object.hasOwn 能正确识别不可枚举属性和 Symbol 类型的键:
- 使用
Object.defineProperty设置enumerable: false的属性,Object.hasOwn仍返回true - 对 Symbol 键同样有效:
Object.hasOwn(obj, Symbol('key'))
兼容性注意
目前主流现代浏览器(Chrome 93+、Firefox 91+、Safari 16.4+)及 Node.js 16.9+ 均支持。如需兼容旧环境,可用 polyfill:
if (!Object.hasOwn) {
Object.hasOwn = Function.prototype.call.bind(Object.prototype.hasOwnProperty);
}
这个 polyfill 利用 bind 绑定 hasOwnProperty 方法到任意对象,绕过被覆盖的风险。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










