javascript对象属性访问分两步:先查自身属性(独占内存、优先覆盖),再沿原型链委托查找(共享方法、动态向上)。所有对象最终都继承自object.prototype,其[[prototype]]为null。

JavaScript 对象的属性访问不是“直接命中”,而是靠一套协同工作的隐藏机制:对象自身属性存储 + 原型链委托查找。两者分工明确、互不干扰,共同支撑起轻量、高效、可共享的对象行为模型。
对象自身属性:独占内存,优先查找
当你用 this.name = '张三' 或字面量 { age: 25 } 创建属性时,这些值被写入对象自身的内存空间。每个实例独有一份,互不影响。
- 引擎访问属性时,**第一步永远先查对象自身**,不走原型链
- 哪怕原型上也有同名属性(比如 Person.prototype.name),也会被实例上的覆盖——这是“就近原则”
- 这种隔离保证了数据私密性:修改 f1.name 不会影响 f2.name
原型链委托:共享方法,按需向上找
方法或通用属性通常挂在构造函数的 prototype 上(如 Person.prototype.sayHello)。它们不在实例里,而是在原型对象中统一存放。实例通过隐式原型 __proto__ 连接到它。
- 当访问 f1.sayHello() 时,f1 自身没有该方法 → 引擎自动顺着 f1.__proto__ 找到 Person.prototype → 成功调用
- 如果 Person.prototype 也没有,引擎继续沿 __proto__ 向上,查 Object.prototype,最后到 null 停止
- 整个过程是**动态委托**,不是复制,也不是预加载——查不到才走下一步,节省开销
内存与链接的底层配合
V8 引擎在创建构造函数时,就为其 prototype 分配独立堆内存;所有实例的 __proto__ 都指向同一块地址。这就实现了“一个模板,多个实例”:
- 实例属性:分散存,各占一份空间
- 原型属性/方法:集中存,所有实例共用一份引用
- [[Prototype]](内部属性)是真实链接,__proto__ 是它的可读接口,prototype 是函数专属的“共享出口”
终点统一:Object.prototype 是所有链的归宿
无论你用对象字面量、数组、函数还是自定义类创建对象,它的原型链最终都会汇入 Object.prototype,而它的 [[Prototype]] 是 null:
- {} → Object.prototype → null
- [] → Array.prototype → Object.prototype → null
- function F(){} → Function.prototype → Object.prototype → null
这个统一终点让 toString、hasOwnProperty 等基础方法能被一切对象使用,无需重复定义。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











