原型链查找不分配内存,仅决定访问路径与复用方式;对象创建时即完成内存分配并固化[[Prototype]]指针,运行时沿已有指针查找,终点为Object.prototype.__proto__===null,确保高效安全。

原型链查找本身不参与内存分配,但它决定了内存中哪些对象会被访问、何时被访问,以及如何复用已分配的内存。
原型链是属性访问路径,不是内存分配指令
JavaScript 引擎在创建对象时就完成内存分配:堆中为对象实例分配空间,并同步设置其内部 [[Prototype]] 指针(可通过 __proto__ 访问)。这个指针只是引用,不触发新内存分配。原型链查找发生在运行时——当读取属性或调用方法时,引擎才沿着已存在的指针逐级访问已有对象,而不是边查边分配。
原型链直接影响内存复用效率
把方法定义在构造函数内部,每次 new 都会在堆中新建一份函数对象;而放在 prototype 上,所有实例共享同一个函数对象:
- 构造函数内定义:
this.say = function() { ... }→ 每个实例独占一份函数副本 - 原型上定义:
Person.prototype.say = function() { ... }→ 所有实例共用一个函数对象
这种复用本质是利用原型链的查找机制:实例自身没有该方法,就自然走到原型对象上取,省去了重复分配。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
原型链终点决定查找边界与内存安全
查找不会无限进行,而是严格受限于内存中已建立的原型链接结构:
- 所有普通对象最终都指向
Object.prototype -
Object.prototype.__proto__ === null,这是链的终止点,也是内存结构的明确边界 - 引擎一旦到达
null就停止查找,返回undefined,避免越界或死循环
这个闭环设计确保了属性访问既高效又安全——它依赖的是预先构建好的内存引用关系,而非动态计算或临时分配。
构造函数与原型对象的内存绑定是静态的
函数对象创建时,引擎就为其分配 prototype 属性(一个普通对象),并设其 constructor 指回自身;new 调用时,新对象的 [[Prototype]] 被设为该 prototype 对象的地址。这些链接在对象诞生那一刻就固化在内存中,后续查找只是顺着这些固定指针跳转,不修改、不重建、不扩容。

















