原型链是引擎动态维护的引用关系链,由对象内部[[prototype]]槽指向另一对象实现;该槽存储内存地址引用,决定属性委托查找路径,终点为object.prototype.[[prototype]] === null。

原型链本身不作为独立结构存于内存,它是一套由引擎动态维护的引用关系链,核心靠每个对象内部的 [[Prototype]] 槽(slot)指向另一个对象来实现。
每个对象都有一个隐藏的 [[Prototype]] 指针
V8 引擎中,每个 JS 对象(除 null 外)在堆内存里是一个 JSObject 结构体,其中包含一个名为 [[Prototype]] 的内部槽。这个槽不暴露给代码直接读写(规范禁止赋值),但存储着对另一个对象的内存地址引用。
-
__proto__是该槽的非标准访问器,已不推荐使用 - 应统一用
Object.getPrototypeOf(obj)读取,Object.setPrototypeOf()修改(慎用) - 这个指针决定了“向上找属性时去哪”——不是复制,而是委托查找
原型对象本身也占用堆内存,且自带 [[Prototype]]
比如 Person.prototype 是一个普通对象,它也被分配在堆中,有自己的属性(如 constructor、sayHello)和自己的 [[Prototype]] 槽。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 默认情况下,
Person.prototype.[[Prototype]]指向Object.prototype -
Object.prototype.[[Prototype]]是null,这是整条链的终点 - 所以原型对象不是“特殊类型”,只是被构造函数的
prototype属性引用着的普通堆对象
方法共享的本质是地址复用,不是拷贝
当把方法定义在 Person.prototype.sayHello = function(){...} 上时:
- 函数体只在堆中创建一次,地址唯一
- 所有实例(
alice、bob)的[[Prototype]]都指向同一个Person.prototype对象 - 调用
alice.sayHello()时,引擎发现自身无该属性,顺着[[Prototype]]找到Person.prototype,再从中取函数并绑定this - 这正是为什么修改
Person.prototype.sayHello会影响所有已有实例
构造函数与原型的双向链接关系
构造函数(如 function Person(){})本身是函数对象,也存在于堆中,它有两个关键属性:
-
Person.prototype:一个对象,是未来所有实例的[[Prototype]]目标 -
Person.prototype.constructor === Person:这个constructor属性是一个指向Person函数的引用,也存于堆中 - 这种互指关系让实例能回溯到构造函数,但不是原型链查找的一部分——链只走
[[Prototype]],不走constructor
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










