判断属性归属的关键是区分“有没有”和“是不是自己的”:hasOwnProperty()仅检查自身属性,in操作符检查包括继承在内的可访问性;两者结合可明确属性来源。

判断一个属性是对象自身的,还是从原型链继承来的,关键在于区分“有没有”和“是不是自己的”。in 操作符只管能不能访问到,而 hasOwnProperty 才真正回答“这个属性是不是我身上定义的”。
用 hasOwnProperty() 检查自身属性
这是最直接、最常用的方式。它只看对象自己身上有没有该属性,完全不理会原型链:
-
obj.hasOwnProperty('name')返回true,说明name是obj自己定义的属性 -
obj.hasOwnProperty('toString')几乎总是false,因为toString来自Object.prototype - 注意:它不能用于
Object.create(null)创建的对象,因为这类对象没有hasOwnProperty方法
用 in 操作符检查是否可访问(含继承)
in 关心的是“能不能读到”,不管来源:
-
'name' in obj—— 如果obj自身有name,或它的原型链上某一层有name,都返回true -
'toString' in obj总是true(除非对象原型被彻底切断),因为所有普通对象都能通过原型链访问到Object.prototype.toString - 适合做“是否存在可用属性”的快速判断,但不适合区分归属
结合使用,明确归属
想确认某个属性到底是哪来的?可以两个方法一起用:
立即学习“Java免费学习笔记(深入)”;
- 如果
'prop' in obj是true,但obj.hasOwnProperty('prop')是false,那它一定是继承来的 - 如果两者都是
true,说明是对象自身的属性 - 如果
'prop' in obj是false,那无论自身还是原型都没有这个属性名
其他辅助方式
在调试或需要更精细控制时,还可以借助:
-
Object.getOwnPropertyNames(obj)—— 获取对象自身所有可枚举+不可枚举的属性名(不含继承) -
Object.keys(obj)—— 只获取自身可枚举属性名 -
Object.getPrototypeOf(obj)—— 获取原型对象,再对它调用hasOwnProperty,可逐层验证继承路径


















