JavaScript中通过new操作符调用首字母大写的构造函数创建实例,其执行四步:创建空对象、绑定this、执行函数体、返回对象;方法应定义在prototype上以共享,避免直接调用导致this失控。

在 JavaScript 中,通过构造函数创建对象实例,核心是使用 new 操作符调用构造函数。
构造函数的基本写法
构造函数本质是一个普通函数,只是约定首字母大写,并配合 new 使用。它内部通常用 this 绑定新对象的属性和方法:
- 函数名首字母大写(如 Person),便于识别是构造函数
- 函数体内用 this.name = name 等方式为实例添加属性
- 不写 return(或只返回基本类型),会自动返回新对象;若显式返回对象,则覆盖默认返回值
用 new 调用构造函数生成实例
new 操作符执行四步:创建空对象 → 将其 this 绑定到该对象 → 执行函数体 → 返回该对象(除非函数返回非 null 对象):
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
function Person(name, age) {
this.name = name;
this.age = age;
this.sayHello = function() {
console.log('Hello, I\'m ' + this.name);
};
}
const alice = new Person('Alice', 25); // 创建实例
alice.sayHello(); // Hello, I'm Alice
注意原型与方法复用
如果把方法写在构造函数内(如上面的 sayHello),每个实例都会拥有独立副本,浪费内存。更合理的方式是把方法挂到构造函数的 prototype 上:
- Person.prototype.sayHello = function() { ... } —— 所有实例共享该方法
- 实例访问属性时优先查自身,找不到则沿 __proto__ 链向上找原型
- 现代写法也可用 class 语法,但底层仍是基于构造函数和原型
常见误区提醒
直接调用构造函数(不加 new)会导致 this 指向全局对象(非严格模式)或 undefined(严格模式),极易引发意外:
- ❌ const p = Person('Bob', 30); —— 不加 new,this 失控
- ✅ const p = new Person('Bob', 30); —— 正确创建实例
- 可在构造函数开头加 if (!(this instanceof Person)) throw new Error(...) 做防护










