对象字面量适合创建独立、轻量对象,语法简洁高效;构造函数适合需多实例、方法共享、类型识别及继承的场景,支持原型复用与复杂初始化。

对象字面量和构造函数都是创建 JavaScript 对象的常用方式,但它们在语义、使用场景、原型链、可复用性等方面有明显差异。选择哪种方式,取决于你是否需要多个相似结构的对象、是否关注实例关系、以及是否要共享方法。
语法简洁性与初始化效率
对象字面量写法直接、直观,适合一次性创建独立对象:
const user = { name: 'Alice', age: 30 };
构造函数需先定义再调用,稍显冗长,但支持参数化初始化:
function User(name, age) {<br> this.name = name;<br> this.age = age;<br>}<br>const user = new User('Alice', 30);
- 字面量对象创建更快,无执行上下文切换开销
- 构造函数支持逻辑封装(如校验、默认值处理),适合复杂初始化
- ES6 的 class 本质仍是构造函数语法糖,不改变底层机制
原型与方法共享机制
字面量创建的对象,其 __proto__ 默认指向 Object.prototype,所有方法都来自顶层,无法自然共享自定义行为:
立即学习“Java免费学习笔记(深入)”;
const a = { say() { return 'hi'; } };<br>const b = { say() { return 'hi'; } }; // 方法重复,内存不共享
构造函数可将方法挂载到 prototype 上,实现真正的共享:
User.prototype.say = function() { return `Hi, I'm ${this.name}`; };<br>const u1 = new User('Alice', 30);<br>const u2 = new User('Bob', 25);<br>u1.say === u2.say; // true
- 字面量对象若需共享方法,得手动设置
__proto__或用Object.setPrototypeOf(),不推荐 - 构造函数配合
prototype是实现“类式继承”和多实例方法复用的基础
实例识别与类型判断
字面量对象统一是 Object 类型,无法区分业务语义:
const car = { brand: 'Tesla' };<br>const person = { name: 'Alice' };<br>car.constructor === person.constructor; // true(都是 Object)
构造函数赋予对象明确的“类型标签”,便于运行时识别:
function Car(brand) { this.brand = brand; }<br>function Person(name) { this.name = name; }<br>const c = new Car('Tesla');<br>const p = new Person('Alice');<br>c instanceof Car; // true<br>p instanceof Person; // true
-
instanceof和constructor属性依赖构造函数调用路径 - 字面量对象无法通过
instanceof区分不同业务含义,影响类型安全设计 - TypeScript 中的接口或 class 声明也更倾向匹配构造函数语义
适用场景建议
没有绝对优劣,关键看需求:
- 配置项、API 响应数据、临时容器对象 → 优先用字面量(清晰、轻量、不可变友好)
- 需要多个具有相同结构和行为的对象(如用户列表、DOM 元素包装器)→ 用构造函数或 class
- 需扩展原型、做继承、配合
Object.create()或代理模式 → 构造函数更灵活 - 现代开发中,常混合使用:用 class 定义模型,用字面量快速生成实例数据










