可以给下相关用例吗?最近在学习TS相关的知识,但很多文档提到TS中的private修饰constructor时就只描述了标题这句话,搞得我一个初学者很懵
(隐约记得以前学java有用过相关的用法,但太久没搞过后端已经忘了……😭)
可以给下相关用例吗?最近在学习TS相关的知识,但很多文档提到TS中的private修饰constructor时就只描述了标题这句话,搞得我一个初学者很懵
(隐约记得以前学java有用过相关的用法,但太久没搞过后端已经忘了……😭)
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);
}
}
10 回答11.2k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答4.9k 阅读✓ 已解决
1 回答3.3k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
不允许实例化的原因很简单,你可能希望能手动控制某个类的构造过程,比如只允许通过工厂模式或单例模式创建,这种时候设为
private
就可以防止在外部不小心实例化出来一个对象来。这点上跟 Java 是一样的。
而不允许继承的原因也很简单,就是禁止扩展,以防任何继承类修改它的方法含义。比如你可能会不经意间写出这样的代码(伪代码):
这约等于 Java 里的 sealed(密闭)类或 final 类。
P.S. 早期版本 Java 用 final 类还有一个好处就是会把类方法变为内嵌,以提升性能;当然了这点就跟 TS 无关了。
但需要指出的是,这两点特性都是 TS 在编译期间语法检查的行为,编译成 JS 后就丧失这样的特性了。