读取属性沿原型链向上查找,设置属性只在当前对象操作。读取时依次检查自身、__proto__指向的原型直至null;设置时直接在当前对象新增或覆盖,不修改原型;delete仅删除自有属性,hasownproperty可判断属性来源。

读取和设置属性时行为不同,是原型链机制里最常被误解的一点。关键在于:读取会沿原型链向上查找,设置却只在当前对象上操作——哪怕属性已在原型中存在。
读取属性:自动向上查找
访问一个属性时,JavaScript 会按顺序检查:
- 先看对象自身有没有这个属性(自有属性)
- 没有就查 __proto__ 指向的原型对象
- 原型里还没有,就继续查原型的 __proto__,直到找到或抵达 Object.prototype.__proto__ === null
例如:obj.toString() 能执行,是因为 obj 自身没 toString,但最终在 Object.prototype 上找到了。
设置属性:只写当前对象,不修改原型
给对象赋值一个属性时,引擎不会去原型链上找“能不能改”,而是直接在该对象上新增或更新:
- 如果属性已存在(自有),就覆盖值
- 如果不存在,就在当前对象上新建这个属性,不会影响原型上的同名属性
典型陷阱:obj.name = 'Alice' 不会改变 obj.__proto__.name,哪怕原型上本来就有 name;之后再读 obj.name,拿到的就是新设的自有属性,原型里的那个彻底被屏蔽了。
删除属性:只能删自有属性
delete obj.prop 只能移除对象自身的属性:
- 删除成功返回 true(即使属性不存在,也返回 true)
- 对继承来的属性(比如 toString)执行 delete,不会报错,但也不起作用
- 删完后再次读取,仍会沿原型链找到它
如何判断属性来源?
用 obj.hasOwnProperty('prop') 可区分:
- 返回 true → 是自有属性(当前对象上定义的)
- 返回 false → 属性来自原型链(可能是 Person.prototype、Object.prototype 等)
配合 Object.getPrototypeOf(obj) 还能逐层查看原型对象,验证查找路径。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











