在 TS 的 class 中,如何防止外部实例化

在 TypeScript(TS)中,如果你想要防止一个类被外部实例化,你可以采取以下几种策略:

  1. 将构造函数设为私有(Private Constructor)

    通过将类的构造函数设为私有,你可以阻止外部代码创建该类的实例。这种技术通常用于实现单例模式、工厂模式或静态类(即只包含静态方法和属性的类)。

    typescript 复制代码
    class PrivateConstructorClass {
        private static instance: PrivateConstructorClass;
    
        private constructor() {
            // 私有构造函数,防止外部实例化
        }
    
        // 静态方法用于获取类的唯一实例(单例模式示例)
        public static getInstance(): PrivateConstructorClass {
            if (!PrivateConstructorClass.instance) {
                PrivateConstructorClass.instance = new PrivateConstructorClass();
            }
            return PrivateConstructorClass.instance;
        }
    
        // 其他类方法和属性...
    }
    
    // 尝试外部实例化会报错
    // const instance = new PrivateConstructorClass(); // 错误:构造函数 'PrivateConstructorClass.constructor' 是私有的。
    
    const instance = PrivateConstructorClass.getInstance(); // 正确:使用静态方法获取实例
  2. 使用抽象类(Abstract Class)

    如果你想要定义一个类,但不允许它直接实例化,你可以将其定义为一个抽象类。抽象类不能被实例化,但可以作为其他类的基类。

    typescript 复制代码
    abstract class AbstractClass {
        // 抽象方法和属性(可选)
        abstract someMethod(): void;
    
        // 具体方法和属性
        concreteMethod() {
            console.log("This is a concrete method.");
        }
    }
    
    // 尝试实例化抽象类会报错
    // const instance = new AbstractClass(); // 错误:不能实例化抽象类 'AbstractClass'。
    
    class ConcreteClass extends AbstractClass {
        someMethod() {
            console.log("Implementing someMethod from AbstractClass.");
        }
    }
    
    const concreteInstance = new ConcreteClass(); // 正确:实例化具体类
  3. 使用静态工厂方法(Static Factory Method)

    虽然这不是直接防止外部实例化的方法,但你可以通过提供一个静态工厂方法来控制实例的创建。这样,即使构造函数是公开的,外部代码也只能通过你提供的工厂方法来获取实例。

    typescript 复制代码
    class FactoryClass {
        private static instances: FactoryClass[] = [];
    
        private constructor() {
            // 仍然可以私有,但这里为了展示工厂方法,我们保持其公开
        }
    
        public static createInstance(): FactoryClass {
            const instance = new FactoryClass();
            FactoryClass.instances.push(instance);
            return instance;
        }
    
        // 其他类方法和属性...
    }
    
    const instance1 = FactoryClass.createInstance();
    const instance2 = FactoryClass.createInstance();
    
    // 注意:虽然构造函数是公开的,但外部代码仍然只能通过 createInstance 方法来获取实例。

    在这个例子中,虽然 FactoryClass 的构造函数是公开的,但外部代码被引导使用 createInstance 静态方法来获取实例。这种方式并不完全防止外部实例化(因为构造函数仍然是公开的),但它提供了一种控制实例创建的方式。

通常,将构造函数设为私有是实现这一目的最直接和有效的方法。如果你不需要单例模式或工厂模式,只需简单地将构造函数设为私有即可。

相关推荐
烬羽10 小时前
navigator.gpu 存在就够了?WebGPU 检测的两层陷阱
typescript·浏览器·全栈
触底反弹11 小时前
🚀 浏览器里跑 1.5B 参数大模型?我用 WebGPU + DeepSeek 做到了
人工智能·面试·typescript
退休倒计时14 小时前
【每日一题】LeetCode 20. 有效的括号 TypeScript
算法·leetcode·职场和发展·typescript
晓说前端16 小时前
TypeScript 核心语法应用 —— Vue 3 中的使用(上)
前端·typescript
渣波17 小时前
React Hooks 核心基石:深度解析 `useState` 的类型推断、泛型约束与空值安全
前端·typescript
YIAN17 小时前
吃透这 5 个核心点,你的 React+TS 代码直接上一个台阶
前端·react.js·typescript
meilindehuzi_a17 小时前
WebGPU DeepSeek项目实战(二):用单例模式加载Tokenizer并转发下载进度
单例模式·typescript·react
用户938515635071 天前
从零在浏览器里跑 DeepSeek-R1:WebGPU + Transformer.js 全链路实战
前端·设计模式·typescript
子兮曰1 天前
Bun vs Node.js 深度对决:跑分快 4 倍,真实业务只剩 3%,2026 年到底该怎么选?
前端·后端·typescript
水獭比特2 天前
Agent 的 timeout 为什么会失效?把一条总预算传到底
人工智能·typescript