最可靠的方法是使用 hasOwnProperty 方法,它只检查对象自身是否拥有指定属性名,不查找原型链,且对 Symbol 属性有效;为防被覆盖,应通过 Object.prototype.hasOwnProperty.call() 安全调用。

在 JavaScript 中,判断一个属性是否为对象自身定义(而非继承自原型链),最可靠的方法是使用 hasOwnProperty 方法。
使用 hasOwnProperty 判断自有属性
hasOwnProperty 是每个对象都继承自 Object.prototype 的方法,它只检查对象自身是否拥有指定属性名(不查找原型链)。
- 返回
true表示该属性是对象自身的可枚举属性(包括值为undefined的属性) - 返回
false表示该属性不存在于对象自身,可能在原型上,也可能完全不存在 - 注意:它对 Symbol 属性同样有效(ES6+)
示例:
const parent = { a: 1 };
const child = Object.create(parent);
child.b = 2;
console.log(child.hasOwnProperty('a')); // false(继承自 parent)
console.log(child.hasOwnProperty('b')); // true(自身定义)
console.log(child.hasOwnProperty('toString')); // false(来自 Object.prototype)
避免直接调用可能被覆盖的 hasOwnProperty
如果对象自身定义了同名属性(如 { hasOwnProperty: null }),直接调用会出错。推荐用 Object.prototype.hasOwnProperty.call() 安全调用:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
const obj = { hasOwnProperty: 'oops' };
console.log(obj.hasOwnProperty('x')); // TypeError: obj.hasOwnProperty is not a function
// 正确写法
console.log(Object.prototype.hasOwnProperty.call(obj, 'x')); // false
console.log(Object.prototype.hasOwnProperty.call(obj, 'hasOwnProperty')); // true
对比其他方法的局限性
有些方法看似能判断,但存在陷阱:
-
in操作符:检查属性是否存在于对象或其原型链中,无法区分自有还是继承 -
Object.keys():只返回自身可枚举属性,但需遍历数组查找,效率低且不支持不可枚举属性 -
Object.getOwnPropertyNames()和Object.getOwnPropertySymbols():能获取所有自有属性(含不可枚举),适合批量检测,但单个属性判断不如hasOwnProperty直观高效
处理不可枚举属性的补充方案
hasOwnProperty 对不可枚举属性也有效(只要它是对象自身的)。若需确认属性的枚举性,可用 Object.getOwnPropertyDescriptor():
const obj = {};
Object.defineProperty(obj, 'hidden', { value: 42, enumerable: false });
console.log(obj.hasOwnProperty('hidden')); // true
const desc = Object.getOwnPropertyDescriptor(obj, 'hidden');
console.log(desc.enumerable); // false
不复杂但容易忽略

















