object.hasown仅判断对象自身是否拥有指定属性,不校验可配置性;要检查可配置性须用object.getownpropertydescriptor获取描述符并读取configurable字段。

Object.hasOwn 不能校验属性的可配置性。
Object.hasOwn 的真实作用
Object.hasOwn(obj, prop) 仅用于判断对象自身是否拥有指定属性(即该属性存在于对象自身的属性键中,而非原型链上),返回布尔值。它与 in 操作符的区别在于不查找原型链,也与 obj.hasOwnProperty() 类似,但更可靠(能安全处理 hasOwnProperty 被覆盖或 null/undefined 对象)。
它完全不涉及属性描述符(如 configurable、writable、enumerable),因此无法得知某个属性是否可配置。
如何真正校验可配置性
要检查属性是否可配置,必须使用 Object.getOwnPropertyDescriptor 获取属性描述符,再读取 descriptor.configurable 字段:
- 如果属性存在且 descriptor.configurable === true,表示该属性可被 delete 或通过 defineProperty 修改描述符
- 如果为 false,则不可删除、不可修改其描述符(如将 writable 从 true 改为 false 会失败)
- 若 getOwnPropertyDescriptor 返回 undefined,说明属性不存在(此时谈不上“可配置”)
组合使用示例
先用 Object.hasOwn 确认属性在对象自身上存在,再用 getOwnPropertyDescriptor 查其可配置性:
const obj = { a: 1 };
Object.defineProperty(obj, 'b', { value: 2, configurable: false });
console.log(Object.hasOwn(obj, 'a')); // true
console.log(Object.hasOwn(obj, 'b')); // true
console.log(Object.hasOwn(obj, 'toString')); // false(在原型上)
const descA = Object.getOwnPropertyDescriptor(obj, 'a');
console.log(descA?.configurable); // true(默认为 true)
const descB = Object.getOwnPropertyDescriptor(obj, 'b');
console.log(descB?.configurable); // false
注意边界情况
某些内置属性(如数组 length、函数 name)默认不可配置;使用 Object.freeze() 或 Object.seal() 后,所有自有属性 configurable 都变为 false;class 中定义的实例属性默认 configurable: true,但类字段(public field)在初始化时也可能受构造方式影响。
不要依赖 hasOwn 推断配置行为——它只回答“有没有”,不回答“能不能改”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











