可通过构造函数自身属性记录实例总数,每次new时递增;es6 class推荐用私有静态字段#count配合getter实现只读访问,避免外部篡改,且需注意勿在原型上定义、区分继承计数及严格模式下的赋值安全。

可以在构造函数内部使用静态属性(即构造函数自身的属性)来记录已创建的实例总数。每次调用 new 实例化时,递增该计数器即可。
使用构造函数自身属性计数
JavaScript 中函数也是对象,因此可以直接在构造函数上添加属性(如 count),并在每次实例化时更新它:
function Person(name) {
this.name = name;
Person.count = (Person.count || 0) + 1;
}
<p>// 查看当前已创建实例数
console.log(Person.count); // 0(尚未实例化)</p><p>const p1 = new Person('Alice');
const p2 = new Person('Bob');</p><p>console.log(Person.count); // 2
</p>
配合 getter 实现更安全的访问
为避免外部意外修改计数器,可将计数逻辑封装,并通过静态 getter 提供只读访问:
function Car(brand) {
this.brand = brand;
Car._count = (Car._count || 0) + 1;
}
<p>Object.defineProperty(Car, 'count', {
get() {
return Car._count || 0;
},
enumerable: true,
configurable: false
});</p><p>const c1 = new Car('Toyota');
const c2 = new Car('Honda');
console.log(Car.count); // 2
// Car.count = 0; // 不会生效(不可写)
</p>
ES6 Class 写法(推荐)
使用 class 语法更清晰,静态属性和方法语义明确:
class Animal {
constructor(name) {
this.name = name;
Animal.count = (Animal.count || 0) + 1;
}
<p>static get count() {
return Animal._count || 0;
}</p><p>static set count(val) {
// 可选:禁止外部赋值
console.warn('Count is read-only');
}
}</p><p>// 实际使用中建议把计数器存在私有静态字段(需配合 # 语法或闭包)
// 更稳妥的方式:
class User {
constructor(name) {
this.name = name;
User.#count++;
}</p><p>static #count = 0;</p><p>static get instanceCount() {
return User.#count;
}
}</p><p>const u1 = new User('Tom');
const u2 = new User('Jerry');
console.log(User.instanceCount); // 2
</p>
注意事项
注意以下几点,避免常见误区:
- 不要在原型上定义计数器(
User.prototype.count),否则每个实例都会共享该属性,但逻辑上它属于类而非实例 - 多个构造函数(如继承链中的子类)会各自维护自己的计数器,不会自动累加父类实例
- 如果构造函数可能被直接调用(非
new),需加this instanceof Constructor判断,防止污染计数 - 在严格模式下,给未声明变量赋值会报错,所以务必显式引用构造函数名或使用
this.constructor(但要注意子类继承时的指向问题)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











