构造函数首字母大写是行业共识而非语法强制,核心作用是语义标记以区分对象创建与普通函数;若小写命名如person()被直接调用,非严格模式下this指向全局导致属性污染;大驼峰(pascalcase)用于类/构造函数,小驼峰(camelcase)用于动词开头的普通函数和名词变量。

构造函数首字母大写,不是语法强制要求,而是一种行业共识和可读性约定,核心作用是让开发者一眼区分“这个函数是用来创建对象的”,而不是普通工具函数。
为什么必须大写?——本质是语义标记
JavaScript 不会因为首字母大写就自动把它当构造函数;但如果你用小写命名,比如 person(),别人调用时很可能直接 person('Alice', 25),结果 this 指向全局对象(非严格模式下),属性被意外挂到 window 或 global 上,引发隐蔽 bug。首字母大写就是个视觉警戒线,提醒“此处需搭配 new 使用”。
大小写混淆的真实后果
- 写成
function person() { this.name = 'A'; },再执行person()→this不是新对象,name可能污染全局 - 写成
function Person() { this.name = 'A'; },却误用Person()(没加new)→ 同样出错,但命名本身已给出纠错线索 - 团队协作中,看到
HttpRequest立刻知道它是类模板;看到makeHttpRequest就知道它是发起请求的动作函数
和其他命名规则怎么配合
它不是孤立存在的,而是嵌在整个命名体系里:
- 构造函数 / 类名:用大驼峰(PascalCase),如
UserInfo、ApiService - 普通函数:用小驼峰(camelCase),且以动词开头,如
getUserInfo、validateEmail - 变量/常量:也用小驼峰,但倾向名词,如
userName、maxRetries
ES6 class 也没绕开这个逻辑
虽然 class Person {} 语法更现代,但它的类名依然要大写。这不是历史包袱,而是延续同一套语义分层:大写 = 可实例化的类型蓝图;小写 = 可执行的行为单元。即使你只写 class,理解构造函数的大写约定,也能更自然地读懂原型链、instanceof 判断、以及 Babel 编译后的底层实现。











