new操作执行四步:创建空对象、绑定原型、以该对象为this执行构造函数、隐式返回对象(仅当显式返回非null对象时才替代)。

构造函数通过 new 关键字实例化时,JavaScript 引擎会自动执行四步操作:创建空对象、绑定 this、执行构造函数体、隐式返回对象。
new 操作的四个关键步骤
当你写 const obj = new Person("Alice", 25); 时,实际发生:
- 创建一个全新的空对象(即
{}) - 将该对象的
[[Prototype]]指向构造函数的prototype属性(实现原型继承) - 用这个新对象作为
this执行构造函数内部代码(如赋值this.name = name) - 若构造函数没有显式返回对象,则自动返回这个新对象;若返回原始值(如字符串、数字),则忽略,仍返回新对象;仅当返回非
null对象时,才替代默认返回
构造函数的基本写法与约定
构造函数本质是普通函数,但需注意命名首字母大写(如 Person),这是行业惯例,便于区分普通函数。它不依赖 new 运行,但若直接调用(Person()),this 会指向全局对象(非严格模式)或 undefined(严格模式),易出错。
示例:
立即学习“Java免费学习笔记(深入)”;
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.sayHello = function() {
return `Hi, I'm ${this.name}`;
};
const p1 = new Person("Tom", 30); // ✅ 正确
const p2 = Person("Jerry", 28); // ❌ this 指向错误,可能污染全局
如何确保函数只能被 new 调用
可通过检测 this 是否为当前构造函数的实例来防护:
- 在函数开头加判断:
if (!(this instanceof Person)) return new Person(name, age); - ES6+ 可用
new.target:如果new.target === undefined,说明未用new调用
例如:
function Person(name, age) {
if (!new.target) {
return new Person(name, age);
}
this.name = name;
this.age = age;
}
箭头函数不能当构造函数
箭头函数没有自己的 prototype,也没有 [[Construct]] 内部方法,因此无法用 new 调用。尝试 new (() => {}) 会抛出 TypeError: xxx is not a constructor。
类(class)本质是语法糖,其构造器(constructor)也遵循同样的 new 规则,且同样禁止用箭头函数定义。


















