TS:当构造函数修饰为 private 时,该类不允许被继承或者实例化,那么设计的意义在哪儿呢?

可以给下相关用例吗?最近在学习TS相关的知识,但很多文档提到TS中的private修饰constructor时就只描述了标题这句话,搞得我一个初学者很懵

(隐约记得以前学java有用过相关的用法,但太久没搞过后端已经忘了……😭)

阅读 4.1k
2 个回答

不允许实例化的原因很简单,你可能希望能手动控制某个类的构造过程,比如只允许通过工厂模式或单例模式创建,这种时候设为 private 就可以防止在外部不小心实例化出来一个对象来。

这点上跟 Java 是一样的。


而不允许继承的原因也很简单,就是禁止扩展,以防任何继承类修改它的方法含义。比如你可能会不经意间写出这样的代码(伪代码):

class Parent {
   public bool getResult() {
      return someCondition; // return if condition is `true`
   }
}

class Child extends Parent {
   @Override
   public bool getResult() {
      return false; // always return `false`
   }
}

static class ResultHelper {
    static void validResult(Parent p) {
        if (!p.getResult()) {
            throw new Error();
        }
    }
}

ResultHelper.validResult(new Child());

这约等于 Java 里的 sealed(密闭)类或 final 类。

P.S. 早期版本 Java 用 final 类还有一个好处就是会把类方法变为内嵌,以提升性能;当然了这点就跟 TS 无关了。


但需要指出的是,这两点特性都是 TS 在编译期间语法检查的行为,编译成 JS 后就丧失这样的特性了。

singleton,或者创建对象时需要特殊的参数,交给用户来创建可能产生错误,使用private constructor 可以提供一个静态工厂方法来创建对象,这样可以确保不回出错或者生成唯一实例

class Foo {
  private constructor(bar: number) {
    if (bar > 0) throw new Error('bar must be less than 0');
  }
  public static create() {
    return new Foo(-1);
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题