Javascript 作为静态类成员可以观察到是一个好的实践吗?

Javascript 作为静态类成员可以观察到是一个好的实践吗?,javascript,angular,typescript,oop,rxjs,Javascript,Angular,Typescript,Oop,Rxjs,我最近开始研究一个新的Angular项目,我发现在非相关组件之间共享状态的常见实现是使用rxjsSubject/BehaviorSubject作为类的静态成员 例如: 导出类AbcService{ 私有静态重要数据:主题=新主题(); 静态获取重要数据$():可观察{ 返回AbcService.importantData.asObservable() } } 用法: @组件({ ... }) 导出类组件{ 构造函数(){ AbcService.importantData$.subscribe(

我最近开始研究一个新的Angular项目,我发现在非相关组件之间共享状态的常见实现是使用rxjs
Subject
/
BehaviorSubject
作为类的静态成员

例如:

导出类AbcService{
私有静态重要数据:主题=新主题();
静态获取重要数据$():可观察{
返回AbcService.importantData.asObservable()
}
}
用法:

@组件({
...
})
导出类组件{
构造函数(){
AbcService.importantData$.subscribe(…)
}
}
我试着思考这种方法的优点,但是,我找不到任何有意义的价值,而且它与注入概念形成了对比


我遗漏了什么,将可观察对象声明为静态类成员有什么好处?

你说得对。这并没有额外的优势,尤其是在Angular的情况下,因为它确保了服务是单例的,因此不需要这样做


但是,它在非角度场景中可能很有用。

这里的好处是任何静态方法的好处-也就是说,可以在不实例化类的情况下调用该方法。限制是静态方法使用的任何静态类属性都将在所有调用中共享

然而,在这个用例中,这一限制本身就是好处——服务应该从单一来源获得。当您使用非单例的不可注入服务时,这非常有用


我写了一个图书馆就是为了这个目的。它可以创建广播电台,并向多个接收机广播数据。或者,它可以创建监听器,该监听器可以从多个发送者接收数据

它提供了更多的功能,例如在广播之前创建接收器(从动态加载的组件广播到静态组件)、名称空间、接收器范围等

它大大简化了这个用例

这是图书馆:

以下是广播公司的示例:

 let messageStream: IMessageStream = createBroadcaster('home/stateChanged');   //Create a broadcaster```
 
 ...
 ...
 /*Receive from it from another component somewhere in the hierarchy*/
 
 let userReceiver = receiveFrom('home/stateChanged', 'contacts/user', (data, error, complete) => {
  console.log(data);
  console.log(error);
  console.log(complete);
 })
 
 
 '''
 '''
 /*Broadcast messages from the first component*/
 nessageStream.emit('logged-in');
那不是个好主意 因为类必须是可测试的。 类必须在不查看其代码的情况下显示其依赖项。DefComponent依赖于AbcService。您必须查看代码才能了解它。 最后,如果更改静态类的名称,则必须将其更改为您不知道的它使用的任何文件。 相反,最好使用工厂模式或接口,使其既可测试又显示依赖性。 我建议你阅读坚实的原则。

我从未真正遇到过这种情况。。老实说,我想不出有什么直接的好处……我很清楚,我的直觉是这是一种不好的做法。但我对OOP和其他语言的了解还不够,对js还不够。因此,我寻找这种方法的利弊。你能解释一下为什么它不可测试吗?因为你不能注入测试服务?用非静态成员替换整个代码也会发生。您的答案是缺少信息。如果您的类存储状态(数据),则运行多个测试可能会相互影响,因此编写测试将更加困难。您的示例代码非常简单,但在大规模情况下可能会发生这种情况。静态类很难或不可能模拟。因此,如果您测试的类依赖于静态类,那么模拟可能不是一个容易的选择。