私有属性指直接存在于对象自身的属性,可用hasownproperty()检测为true;公共属性来自原型链,in操作符返回true但hasownproperty()返回false;es6#私有字段无法被hasownproperty检测。

判断一个属性是私有(自有)还是公共(继承),关键看它是否直接存在于对象自身,而不是从原型链上继承而来。核心就两个方法:用 hasOwnProperty() 看是不是“自己家的”,再配合 in 操作符看是不是“能用的”——两者组合就能明确区分。
私有属性:只属于当前对象本身
私有属性(也称自有属性)是指通过 this.xxx = value 或直接赋值给实例对象添加的属性,它不共享、不继承,每个实例独立保存。
-
obj.hasOwnProperty("prop")返回 true,说明该属性是对象自身的私有属性 - 即使原型上也有同名属性,只要对象自己有,
hasOwnProperty就只认自己这份 - 注意:ES6 的
class中用#声明的真私有字段(如#name)无法被hasOwnProperty检测,也不在for...in或Object.keys()中出现
公共属性:来自原型链,被多个实例共享
公共属性通常定义在构造函数的 prototype 上,或通过 Object.setPrototypeOf() 设置,所有实例通过原型链访问同一份数据。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
"prop" in obj返回 true,但obj.hasOwnProperty("prop")返回 false → 这就是公共属性 - 修改公共属性会影响所有共享它的实例(除非被私有属性遮蔽)
- 可通过
Object.getPrototypeOf(obj).hasOwnProperty("prop")进一步确认它是否定义在直接原型上
快速判断逻辑(一行可写)
不用记太复杂,实际开发中常用这组判断:
- 是私有属性?→
obj.hasOwnProperty("x") - 是公共属性?→
"x" in obj && !obj.hasOwnProperty("x") - 是否存在(不管哪来的)?→
"x" in obj(最宽松,包含私有+公共)
容易混淆的边界情况
有些属性看似“私有”,实则不是;有些看似“公共”,却因遮蔽失效:
-
obj.x = 1后,obj.hasOwnProperty("x")为 true;若之后删掉:delete obj.x,再查就变 false,但"x" in obj可能仍为 true(如果原型上有) - 用
Object.defineProperty(obj, "y", { value: 2, enumerable: false })添加的属性,hasOwnProperty仍返回 true(它是私有属性),但不会出现在for...in或Object.keys()中 - 箭头函数没有自己的
prototype,不能作为构造函数,所以谈不上“原型上的公共属性”
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










