hasownproperty()是最直接检测属性是否在实例自身的方法,返回true表示自有属性,false表示不在自身;需配合in操作符区分原型链存在性,静态属性须在构造函数上调用。

用 hasOwnProperty() 是最直接、最常用的方式:返回 true 表示属性在实例自身上,false 表示不在自身(可能在原型链上,也可能根本不存在)。
只看实例自身,不查原型链
hasOwnProperty() 专为这个目的设计——它完全忽略原型链,只检查当前对象是否“自己拥有”该属性。
- 即使原型上有同名属性,只要实例没定义,就返回 false
- 属性名必须是字符串或 Symbol;传入数字或布尔值会自动转成字符串,容易出错
- 它继承自
Object.prototype,所以几乎所有对象都能用(null和undefined除外)
结合 in 操作符定位来源
单靠 hasOwnProperty() 只能知道“是不是自己的”,但不知道“如果不在自己身上,是不是在原型链里”。这时搭配 in 就能分清三类情况:
-
obj.hasOwnProperty('x') === true→ 属性在实例自身 -
obj.hasOwnProperty('x') === false && 'x' in obj === true→ 属性在原型链上(非自身,但可访问) -
'x' in obj === false→ 属性既不在自身,也不在整条原型链上
注意静态属性和构造函数自身的属性
静态属性(如 MyClass.version)属于构造函数本身,**不在实例的原型链上**。想检测它,不能对实例调用 hasOwnProperty(),而要对构造函数本身调用:
-
MyClass.hasOwnProperty('version')—— 正确,查构造函数自身 -
new MyClass().hasOwnProperty('version')—— 总是 false,因为静态属性不参与实例继承
其他辅助方法
除 hasOwnProperty() 外,还有几个方法可交叉验证:
-
Object.getOwnPropertyDescriptor(obj, 'prop'):返回描述符对象说明是自有属性,返回undefined说明不是 -
Object.getOwnPropertyNames(obj):列出所有自有属性名(含不可枚举的),不含原型链上的 -
prop in obj:只管“能否访问到”,不管在哪一层,适合快速存在性判断











