如何创建实例化时自动递增ID的类?现有IIFE闭包方案是否有更优解
你现有的IIFE+闭包实现逻辑是完全可用的,针对单例ID序列的场景足够简洁。以下是两种更贴合现代JS语法、扩展性更强的实现方案:
方案1:类静态私有属性封装(最常用,无额外工厂依赖)
把ID自增逻辑直接封装到Person类内部,不需要额外维护工厂函数,调用方式更直观,而且静态私有属性可以保证计数器不会被外部意外修改。
class Person { // 静态私有计数器,外部无法直接访问修改 static #idCounter = 0; constructor(name) { this.id = ++Person.#idCounter; this.name = name; } } // 直接实例化即可,不用调用工厂函数 const jenny = new Person('Jenny'); // ID: 1 const eliza = new Person('Eliza'); // ID: 2
优势:
- 调用逻辑更符合直觉,无需记忆额外的工厂方法
- 私有属性保证ID计数器的安全性,避免外部篡改
- 代码更精简,没有额外的IIFE嵌套
如果需要兼容ES2022之前的运行环境,把静态私有属性的#换成下划线_作为约定私有即可,逻辑不变。
方案2:可实例化的工厂类(适合多ID序列场景)
如果你需要多个独立的ID生成序列(比如不同分组的Person实例各自从1开始计数),可以用带私有属性的工厂类,比单例IIFE工厂灵活性更高。
class Person { constructor(id, name){ this.id = id; this.name = name; } } class PersonFactory { // 每个工厂实例有独立的计数器 #idCounter = 0; create(name) { return new Person(++this.#idCounter, name); } } // 可以创建多个独立的工厂,各有各的ID序列 const factoryA = new PersonFactory(); const jenny = factoryA.create('Jenny'); // ID: 1 const factoryB = new PersonFactory(); const tom = factoryB.create('Tom'); // ID: 1
优势:
- 支持多套独立的ID生成规则,适合复杂业务场景
- 可以扩展更多能力,比如添加重置ID、自定义起始ID的方法
- 逻辑更清晰,符合面向对象的封装原则
内容的提问来源于stack exchange,提问作者Don P
相关产品推荐
相关产品推荐

