javascript对象内存模型由实例属性字典和[[prototype]]原型指针构成:属性字典存储自有属性,原型指针形成链式继承结构,查找时先查自身字典再沿原型链向上委托。

JavaScript 对象的内存模型由两部分核心组成:实例自身的属性字典(own properties)和指向原型的内部指针([[Prototype]])。它不是传统类语言中“类模板 + 实例字段”的静态布局,而是一种动态、分层的属性查找结构。
属性字典:对象自身的键值存储
每个对象在堆内存中都维护一个独立的属性字典,用于存放该对象**自有**的属性(包括数据属性和访问器属性)。这些属性直接挂载在对象本身上,不与其他对象共享。
- 属性名是字符串或 Symbol,值可以是任意类型(原始值、对象、函数等)
- 属性具有四个可配置的特性:
value、writable、enumerable、configurable(通过Object.defineProperty精确控制) - 使用
obj.prop或obj["prop"]访问时,引擎首先查这个字典;命中则直接返回,不走原型 - 例如:
const p1 = { name: "Alice" };中的name就存在p1自身的字典里
原型指针:隐式继承链的起点
每个对象内部都有一个不可枚举、不可直接赋值的内部属性 [[Prototype]](可通过 obj.__proto__ 或 Object.getPrototypeOf(obj) 读取),它指向另一个对象——即该对象的原型。
- 这个指针在对象创建时就确定:
new Fn()的实例指向Fn.prototype;字面量{}指向Object.prototype - 原型对象本身也是普通对象,同样拥有自己的属性字典和
[[Prototype]],从而形成链式结构 - 属性访问失败时(字典中未找到),引擎自动沿
[[Prototype]]向上查找,直到null - 注意:
Function作为函数对象,既有prototype(供其实例继承),也有[[Prototype]](自身继承自Function.prototype)
构造函数、prototype 与实例的关系
函数对象在定义时自动获得 prototype 属性,它是一个普通对象,默认含 constructor 指回该函数。这个 prototype 就是未来所有 new 出来的实例的原型目标。
-
function Person() {}→ 创建函数对象,同时生成Person.prototype对象 -
const p = new Person()→p.[[Prototype]] === Person.prototype为true -
Person.prototype.say = function() {}→ 方法只存一份,在原型对象字典中;所有实例通过原型链共享调用 - 若在实例上赋值同名属性(如
p.name = "Bob"),会写入实例字典,屏蔽原型上的同名属性(shadowing)
内存布局的关键事实
理解这个模型能避免常见误区:原型不是“模板副本”,而是被多个实例**共享引用**的对象;实例字典与原型字典物理分离,查找是运行时链式委托,而非编译期绑定。
- 函数本身在堆中占两块空间:函数代码体 + 其
prototype对象(两者地址不同) - 实例对象只保存自身属性 + 一个指针(
[[Prototype]]),不复制原型内容 - 修改原型对象(如添加方法)会即时影响所有已存在和将创建的实例
-
Object.create(null)创建的对象,其[[Prototype]]为null,无原型链
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











