JavaScript构造函数规范类结构的核心是function定义、new调用、this绑定实例属性及prototype添加共享方法;需首字母大写命名、避免引用类型默认值共享、方法挂prototype复用、修复constructor指向、用instanceof校验类型、借用构造+Object.create实现继承。

JavaScript 中用构造函数规范类结构,核心是通过 function 定义构造器、用 new 调用、配合 this 绑定实例属性,并合理使用 prototype 添加共享方法——这是 ES6 class 语法的底层逻辑,也是理解原型继承的关键。
定义构造函数并初始化实例属性
构造函数名首字母大写(约定,非强制),内部用 this 指向新创建的实例,为每个实例分配独立的属性:
function Person(name, age) {
this.name = name; // 每个实例独有
this.age = age;
this.skills = []; // 避免引用类型被共享(如直接写 this.skills = [])
}
⚠️ 注意:不要在构造函数里给引用类型(如数组、对象)赋默认值并期望“每个实例自动隔离”——上面写 this.skills = [] 是安全的,因为每次 new 都执行一次,生成新数组;但若写成 Person.defaultSkills = [] 再赋给 this.skills,就可能意外共享。
把方法挂到 prototype 上实现复用
所有实例共享的方法应定义在构造函数的 prototype 上,避免每次创建实例都重复生成函数:
立即学习“Java免费学习笔记(深入)”;
Person.prototype.sayHello = function() {
console.log(`Hi, I'm ${this.name}`);
};
Person.prototype.addSkill = function(skill) {
this.skills.push(skill);
};
- 这样
sayHello在内存中只存在一份,所有Person实例通过原型链访问它 - 直接写
Person.prototype = { ... }会覆盖整个原型对象,丢失默认的constructor指向,需手动修复:Person.prototype.constructor = Person
用 instanceof 和 constructor 校验类型
构造函数天然支持类型识别,便于调试和条件判断:
const alice = new Person('Alice', 28);
console.log(alice instanceof Person); // true
console.log(alice.constructor === Person); // true
这比 typeof obj === 'object' 更精确,尤其在多层构造或继承场景中很实用。
模拟简单继承:借用构造 + 设置原型链
若需子类复用父类初始化逻辑,常用组合模式:
function Student(name, age, grade) {
Person.call(this, name, age); // 借用父构造函数,初始化 this
this.grade = grade;
}
// 关联原型链(不执行父类构造函数)
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student; // 修复 constructor
// 添加子类特有方法
Student.prototype.study = function() {
console.log(`${this.name} is studying in grade ${this.grade}`);
};
这种写法清晰表达了“Student 是一种 Person”,且保持了属性隔离与方法复用,是原生构造函数模式下最稳妥的继承方式。


















