【发布时间】:2019-08-29 03:37:49
【问题描述】:
这个问题在评论部分脱轨,更多地与静态工厂方法与构造函数的优势有关
以下面为例
export class User extends Model<UserProps> {
// Suggested Method (With no constructor)
static buildUser(attrs: UserProps) : User {
return new User(new Attributes(attrs), new Eventing(), new ApiSync(rootUrl));
}
// why not do it like this instead? No need to call User.buildUser()
constructor(attrs: UserProps) {
super(new Attributes(attrs), new Eventing(), new ApiSync(rootUrl));
}
}
我知道只有实现 buildUser 方法才会隐式调用带有 super 和 args 的构造函数,如果从未定义过构造函数。
但是,buildUser 是否会提供构造函数中的直接超级调用不会提供的某些功能?
似乎只是创建用户的“额外”代码。
let user = User.buildUser(some attr)
对
let user = new User(some attr);
【问题讨论】:
-
我想你误解了
static方法是什么。第一种情况就是:let user = User.buildUser(some attr). -
是的,我在那里犯了一个错误。即使那样,您也会调用 new User.buildUser(some attr) 与 new User(some attr)。调用 new User(someattr) 似乎更直观
-
不,在第一种情况下不使用
new。该模式称为“静态工厂方法”。谷歌搜索应该会产生一些参考文章。 -
我一般不知道。我经常在我不想用参数检查之类的东西污染我的构造函数的情况下使用它。
-
这真的取决于你想要实现什么,以及我相信你的编码风格。它通常很有用,并且在您有多种方式来构造元素的情况下使用,并且您不希望有一个 biiiig 构造函数对每种情况进行所有类型检查等......或者只是为了便于理解。像这个例子。 stackify.com/static-factory-methods
标签: typescript oop inheritance