对象字面量在执行到该行代码时立即创建,原型直接指向object.prototype,每次出现都生成全新对象,无构造函数开销,属性和方法均存在于自身,不共享。

对象字面量在执行到那一行代码时立即创建,其原型链在创建瞬间就已确定——直接指向 Object.prototype,不经过构造函数中转,也不依赖 new 或 prototype 配置。
创建时机:运行时同步分配,无延迟
当 JS 引擎解析到 { name: '张三', age: 28 } 这样的字面量时,会立刻在堆内存中分配一个新对象,并初始化属性。这个过程发生在代码执行流到达该语句的那一刻,不是预编译阶段,也不是调用时才生成。
- 每次出现字面量,都生成一个全新对象(哪怕内容完全相同)
- 不存在“复用已有字面量”的优化;
{a:1}和{a:1}是两个独立对象 - 没有构造函数调用开销,也没有 new 的四步流程,效率最高
原型挂载:隐式绑定 Object.prototype
字面量对象的 __proto__ 在创建完成时就已指向 Object.prototype,这是引擎自动完成的,开发者无法干预或跳过。
- 等价于内部执行了
Object.create(Object.prototype) - 因此能直接使用
hasOwnProperty、toString、valueOf等方法 - 可通过
Object.getPrototypeOf(obj) === Object.prototype验证 - 不能通过字面量语法直接指定其他原型(比如想让它继承自 Array.prototype 就不行)
与构造函数方式的本质区别
字面量不走构造函数路径,所以它和 new Object() 虽然结果相似,但语义和底层机制不同:
-
new Object({a:1})先创建空对象,再用赋值方式填充——多一层操作 - 字面量是语法糖,V8 等引擎对其有专门优化,性能略优于
new Object() - 构造函数实例的
__proto__指向的是该函数的prototype,而字面量永远只认Object.prototype
为什么不能共享方法?
因为所有属性和方法都写在对象自身上,没有原型层参与分发:
const a = { say() { console.log('a') } };const b = { say() { console.log('b') } };- 即使方法体一样,
a.say !== b.say,内存里存了两份函数 - 没有原型链查找环节——访问
a.say直接命中自身属性,不会向上找
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











