自有属性直接定义在对象自身,继承属性来自原型链;用hasownproperty()可准确判断是否为自有属性,object.keys()返回可枚举自有属性名,object.getownpropertynames()返回全部自有属性名(含不可枚举),继承属性需沿原型链手动获取。

JavaScript 中,“自有属性”和“继承属性”的区分核心在于**属性定义的位置**:自有属性直接挂在对象自身上;继承属性来自原型链上的某个祖先对象(比如构造函数的 prototype 或通过 Object.create() 指定的原型)。
怎么判断一个属性是不是自有属性?
用 obj.hasOwnProperty(prop) 最直接可靠。它只检查对象自身,不沿原型链查找。
-
hasOwnProperty('x')返回 true → 属性x是对象自己定义的 -
hasOwnProperty('toString')几乎总是 false → 因为toString来自Object.prototype - 注意:
hasOwnProperty本身是继承来的,所以obj.hasOwnProperty('hasOwnProperty')是 false(除非你手动在obj上重写了它)
如何获取所有自有属性名?
Object.getOwnPropertyNames(obj) 返回对象自身所有属性名(含不可枚举的),但不包括原型链上的任何属性。
-
Object.keys(obj)只返回**可枚举的自有属性名**(更常用,适合遍历) -
Object.getOwnPropertyNames()还能拿到defineProperty设置的不可枚举属性,比如length在数组上 - 两者都**不会出现**
toString、valueOf这类继承来的名字
怎么看到继承来的属性?
没有单个 API 直接列出“所有继承属性”,但你可以顺着原型链查:
- 用
Object.getPrototypeOf(obj)获取原型对象 - 再对原型调用
Object.getOwnPropertyNames(),就能看到它身上的自有属性——这些对原对象来说就是继承属性 - 如果想完整还原整个原型链上的可访问属性,需递归向上走,同时避开重复(比如自有属性已存在,就不该再算作“继承”)
常见误区提醒
别混淆检测方式的作用范围:
-
'prop' in obj→ 查自有 + 所有继承(整条原型链) -
obj.hasOwnProperty('prop')→ 只查自有 -
obj.propertyIsEnumerable('prop')→ 必须同时满足:自有 + 可枚举 -
obj.prop !== undefined不可靠:属性值可能真就是undefined,不能反推属性是否存在
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











