JavaScript中constructor可使用rest参数(...args),需置于参数末尾,兼容普通参数与解构;支持数组/对象解构提取关键值,并在继承时通过super(...args)转发参数,且super必须最先调用。

JavaScript 中 constructor 可以像普通函数一样接收剩余参数(rest parameters),只需在参数列表末尾使用 ...args 语法即可。它不是特殊语法,而是 ES6 引入的通用特性,适用于所有函数,包括类构造器。
constructor 中使用 rest 参数的基本写法
直接在 constructor 的形参中使用 ...args,它会收集所有未被单独声明的实参,形成一个真数组,可直接遍历或解构。
- 必须放在参数列表最后,否则报错
- 可与普通参数共存,例如
constructor(name, ...hobbies) - 接收的是实际传入的值,不依赖 arguments 对象(arguments 在箭头函数或严格模式下受限,rest 更可靠)
结合解构提取关键参数再收剩余项
常见场景是前几个参数有明确语义(如 id、title),其余为可选配置项。可用数组解构 + rest 一次性拆分:
class Product {
constructor(id, title, ...tags) {
this.id = id;
this.title = title;
this.tags = Array.isArray(tags[0]) ? tags[0] : tags;
}
}
这样调用 new Product(1, 'JS Guide', 'programming', 'book') 或 new Product(1, 'JS Guide', ['programming', 'book']) 都能兼容处理。
立即学习“Java免费学习笔记(深入)”;
配合对象解构处理命名参数
若希望支持类似“选项对象”的灵活传参,可将 rest 参数默认设为空对象,并用解构提取默认值:
class User {
constructor(name, ...options) {
const [opts = {}] = options;
this.name = name;
this.age = opts.age ?? 0;
this.role = opts.role || 'user';
}
}
调用时可写成 new User('Alice', { age: 28, role: 'admin' }),清晰且易扩展。
注意 this 绑定与 super 调用时机
若继承自父类,super(...args) 必须在 constructor 中最先调用,且传递的参数也支持 rest:
-
super(...args)直接转发全部参数给父构造器 - 也可筛选后转发,例如
super(args[0], args[1])或super(...args.slice(0, 2)) - 切记:在调用 super 前不能访问 this,否则报错


















