构造函数在new调用时自动执行初始化逻辑,核心是通过this赋值完成属性初始化,支持参数解构默认值、类型转换、私有方法封装及防御性校验,但应保持同步轻量,避免共享引用或复杂副作用。

构造函数在实例化时自动执行初始化逻辑,关键在于它被 new 调用的那一刻就立即运行——这是 JavaScript 引擎强制保障的时机,无需手动触发。
构造函数本身就是初始化入口
只要用 new 调用一个构造函数(无论是 function 声明还是 class 中的 constructor),引擎就会:
- 创建一个空对象,并把它的
__proto__指向构造函数的prototype - 将这个新对象绑定为函数内部的
this - 立刻执行函数体内的全部语句
- 默认返回该对象(除非显式
return一个非原始值的对象)
也就是说,你在函数体内写的每一条赋值、校验、方法绑定,都在实例诞生的同一毫秒内完成。
在函数体内直接操作 this 初始化属性
这是最核心、最可靠的方式。所有初始化逻辑都落在 this.xxx = ... 这类语句上:
立即学习“Java免费学习笔记(深入)”;
-
基础赋值:如
this.name = name || '未知'、this.createdAt = new Date() -
类型转换与降级:如
this.age = Number(raw.age) || 0、this.tags = Array.isArray(raw.tags) ? raw.tags : [] -
调用私有初始化方法:如
this._initId()或this._validate(),把复杂逻辑封装起来,保持构造函数体简洁
注意:不要在 prototype 上初始化引用类型(比如 User.prototype.items = []),否则所有实例会共享同一个数组。
利用参数解构 + 默认值简化初始化
ES6+ 支持在参数层就做结构化解构和兜底,默认值会在传参缺失时自动生效,让初始化更健壮:
- 写法示例:
function User({ id = Date.now(), name = '匿名', role = 'user' } = {}) { this.id = id; this.name = name; this.role = role; } - 好处是避免
raw.name为undefined或null时导致this.name也变成undefined - 嵌套解构还能处理深层配置,比如
{ profile: { avatar } } = options
配合验证或工厂逻辑提升安全性
纯构造函数不强制校验,但你可以主动加入防御性逻辑:
- 参数合法性检查:
if (typeof name !== 'string' || name.trim() === '') throw new Error('姓名必须是非空字符串') - 对敏感字段做防御性复制:
this.permissions = Array.from(raw.permissions || []),防止外部修改影响实例 - 需要复杂流程(如异步加载、依赖注入)时,建议改用工厂函数,而非硬塞进构造函数——构造函数应保持同步、轻量、无副作用
构造函数不是万能初始化器,而是对象“定型”的第一站。它负责让实例一出生就有结构、有默认态、有基本约束。其余逻辑,该延后就延后,该拆分就拆分。


















