object.hasown是es2022引入的静态方法,chrome 93+、firefox 92+、safari 15.4+、edge 93+和node.js 16.9+原生支持;safari≤15.3、firefox≤91、ie全系及旧版android webview不支持。

Object.hasOwn 是 ES2022 正式引入的静态方法,用于安全判断对象是否**自有属性**(不查找原型链),比 obj.hasOwnProperty(prop) 更可靠——它不依赖实例方法,避免了原型被污染或覆盖导致的误判。
哪些浏览器原生支持?
Chrome 93+、Firefox 92+、Safari 15.4+、Edge 93+ 和 Node.js 16.9+ 均已内置支持,无需额外处理。但以下环境**不支持**:
- Safari ≤15.3
- Firefox ≤91
- IE 全系(已淘汰但仍有遗留场景)
- 部分旧版 Android WebView(如 Android 10 及更早系统自带 WebView)
为什么不能直接用 obj.hasOwnProperty?
因为 obj.hasOwnProperty 是实例方法,如果对象原型被篡改(例如 Object.prototype.hasOwnProperty = null),调用就会失败或返回错误结果。而 Object.hasOwn 是静态方法,不走原型链,天然免疫此类污染。
所以降级时也不能简单写成 obj.hasOwnProperty(prop),必须通过 Object.prototype.hasOwnProperty.call(obj, prop) 来“借”出原始方法。
轻量 polyfill 写法(推荐)
在入口文件顶部(如 main.ts 或 _app.tsx)加入以下代码即可:
if (!Object.hasOwn) {
Object.hasOwn = function (obj, prop) {
if (obj == null) {
throw new TypeError('Cannot convert undefined or null to object');
}
return Object.prototype.hasOwnProperty.call(Object(obj), prop);
};
}
这个实现做了基本校验,行为与标准一致,且不依赖第三方库。
使用 core-js 的自动化方案
若项目已集成 core-js(如通过 Babel + @babel/preset-env),可按需引入:
- 全局注入(适合 SSR 或传统 SPA):
import 'core-js/actual/object/has-own'; - 按需导入(推荐给模块化项目):
import { hasOwn } from 'core-js/actual/object';
注意:core-js/actual 会修补全局环境,务必确保它在所有业务代码之前执行。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











