构造函数创建实体的核心是封装数据与方法:直接在this上定义方法生成独立副本;挂载到prototype实现共享以提升效率;结合闭包实现私有状态控制;class语法为构造函数的语法糖,更清晰且支持静态方法与继承。

用构造函数创建具有特定行为的实体,核心是把数据(属性)和操作数据的方法(行为)封装在同一个函数中,并通过 new 调用生成独立实例。
定义构造函数并绑定方法
构造函数本质是一个普通函数,但约定首字母大写,内部用 this 绑定实例属性和方法。方法直接赋值给 this,每个实例都会拥有自己的一份副本:
- 适合行为逻辑较简单、不追求内存复用的场景
- 方法在每次实例化时重新创建,可能影响性能(大量实例时)
例如创建一个带移动行为的“小车”实体:
function Car(brand, speed) {
this.brand = brand;
this.speed = speed;
this.move = function() {
console.log(`${this.brand} 正以 ${this.speed} km/h 行驶`);
};
}
<p>const myCar = new Car('Tesla', 120);
myCar.move(); // Tesla 正以 120 km/h 行驶
</p>
用 prototype 共享方法提升效率
将方法挂载到构造函数的 prototype 上,所有实例共享同一份方法,节省内存,也更符合面向对象的设计习惯:
- 方法只定义一次,所有实例通过原型链访问
- 新增行为只需扩展 prototype,不影响已有实例
延续上面的例子:
function Car(brand, speed) {
this.brand = brand;
this.speed = speed;
}
<p>Car.prototype.move = function() {
console.log(<code>${this.brand} 正以 ${this.speed} km/h 行驶</code>);
};</p><p>Car.prototype.accelerate = function(delta) {
this.speed += delta;
};</p><p>const carA = new Car('BMW', 90);
const carB = new Car('Honda', 70);
carA.move(); // BMW 正以 90 km/h 行驶
carB.accelerate(15);
carB.move(); // Honda 正以 85 km/h 行驶
</p>
结合闭包或私有状态控制行为边界
如果某些状态不希望被外部直接修改(比如防止速度设为负数),可在构造函数内用局部变量 + 特定方法暴露可控接口:
- 利用作用域隔离,实现类似“私有字段”的效果
- 对外只提供经过校验或封装的行为(如
setSpeed)
例如限制速度范围:
function SafeCar(brand, initialSpeed) {
let _speed = Math.max(0, initialSpeed); // 私有变量
this.brand = brand;
<p>this.getSpeed = () => _speed;
this.setSpeed = (v) => {
if (typeof v === 'number' && v >= 0 && v {
console.log(<code>${this.brand} 当前速度:${_speed} km/h</code>);
};
}</p><p>const c = new SafeCar('Toyota', 60);
c.setSpeed(-10); // 警告
c.setSpeed(180);
c.move(); // Toyota 当前速度:180 km/h
</p>
现代替代方案:class 语法(本质仍是构造函数)
ES6 的 class 是构造函数的语法糖,写法更清晰,底层仍基于原型链,支持 constructor、method、static 和继承(extends):
- 可读性高,结构明确,推荐新项目使用
- 静态方法用
static关键字,属于类本身而非实例
等价写法:
class Car {
constructor(brand, speed) {
this.brand = brand;
this.speed = speed;
}
<p>move() {
console.log(<code>${this.brand} 正以 ${this.speed} km/h 行驶</code>);
}</p><p>static info() {
return '车辆实体类';
}
}</p><p>const car = new Car('Ford', 110);
car.move(); // Ford 正以 110 km/h 行驶
console.log(Car.info()); // '车辆实体类'
</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











