JavaScript对象模型基于原型链而非类,对象通过[[Prototype]]指针链接到原型,属性查找沿链逐级访问直至null,方法存于原型实现内存共享。

JavaScript 的对象模型不是靠“类”组织的,而是靠对象之间的隐式链接——原型链——来建立继承与共享关系。这种设计直接影响内存分配方式、属性查找路径和对象行为一致性。理解它,关键不在记住术语,而在看清内存中对象、原型、构造函数三者如何真实连接。
对象创建时的内存绑定关系
每次创建对象,JavaScript 引擎都会在堆内存中分配空间,并同步设置其内部 [[Prototype]](可通过 __proto__ 访问)。这个链接不是复制,而是指针引用:
- 用字面量
const obj = {a: 1}创建:对象的__proto__直接指向Object.prototype - 用构造函数
new Person("Alice")创建:对象的__proto__指向Person.prototype,而Person.prototype.__proto__又指向Object.prototype - 函数本身也是对象:所有函数的
__proto__都指向Function.prototype;Function.prototype是个特殊函数对象,它的__proto__指向Object.prototype
原型链的终点与内存结构闭环
原型链不是无限延伸的,而是一条有明确终点的单向引用链。所有普通对象最终都归于同一个“根”:
-
Object.prototype.__proto__ === null—— 这是整条链的终止符,防止无限查找 -
Function.prototype虽是函数,但它的__proto__仍是Object.prototype,不是自身 -
Function.__proto__ === Function.prototype—— 这是唯一一个函数对象的__proto__指向自身原型的特例 - 数组、日期、正则等内建类型,其原型链最终也都汇入
Object.prototype,再落至null
属性查找与内存访问的实际路径
当你写 obj.method(),引擎不会立刻报错或执行,而是按固定顺序逐层访问内存中的对象:
立即学习“Java免费学习笔记(深入)”;
- 先查
obj自身属性表(自有属性),命中则返回 - 未命中 → 读取
obj.__proto__,查该对象上的属性 - 仍不命中 → 继续读取
obj.__proto__.__proto__,依此类推 - 直到某一层找到属性,或抵达
null报undefined
这个过程完全发生在运行时,不生成新对象,也不拷贝数据——只是沿着已存在的指针跳转,所以轻量高效。
内存优化的核心逻辑:方法只存一份
原型链的本质价值,在于让多个实例共享同一份方法定义:
- 如果把方法写在构造函数里(
this.fn = function(){...}),每个实例都会在堆中单独存一份函数闭包,浪费内存 - 而写在
Constructor.prototype上,函数体只存在于原型对象一处,所有实例通过__proto__共享访问 - 即使你动态修改
Person.prototype.sayHi,所有已有和新建的Person实例都会立即生效——因为它们访问的是同一个内存地址


















