angular 中的 Vue.prototype 相当于什么?

What is the equivalent of Vue.prototype in angular?

我从一年前开始使用 Vue.js,现在我必须开始使用 Angular,我习惯于在所有组件之间共享一个对象实例 [=24] =], 所以我不需要在每个组件中调用它。

例如。调用 this.$toast.

不知道Angular有没有类似的东西。

我正在使用 Angular 8.

我阅读了有关单例服务的指南,但它一直将实例传递给我需要它的组件的构造函数 https://angular.io/guide/singleton-services

我不是女性 Vue.prototype 但可以创建一个在所有组件之间共享的单例对象,其服务添加到提供者列表 app.module 级别

import { Injectable } from '@angular/core';

@Injectable({
  providedIn:"root" // 
})
export class SharedService {

  constructor() { }

}

not in you don't use providedIn you can manually add the service tio app.module

import { SharedService } from './shared.service';

@NgModule({
  imports:      [ BrowserModule, FormsModule ],
  declarations: [ AppComponent, HelloComponent ],
  bootstrap:    [ AppComponent ],
  providers: [SharedService] // 
})
export class AppModule { }

该服务将被创建一次,并在您每次注入任何组件时立即注入

Vue.prototype 可以在 Vue 中修改以提供全局依赖项并更改所有应用程序组件的行为。 Angular中没有对应物,application-wide依赖的概念自AngularJS被丢弃。

Vue.prototype修改的缺点与优点相同,它为应用程序提供了全局范围并改变了整个应用程序的行为。如果行为不受欢迎,则无法轻易将其与应用程序分离。这可以防止应用程序的某些部分被轻易提取和重用。由于 third-party 扩展可以自由修改 Vue.prototype,修改可能会以意想不到的方式发生冲突,例如$toast 名字可以被两个不同的人使用 extensions/plugins.

另一方面,Angular 需要一些样板代码来生成更好的应用程序架构。它大量使用依赖注入,常用的单例可以通过注入toast服务来访问:

class Component {
  constructor(public toast: Toast) {}
}

可以有基础组件 class 产生 DRYer 组件。通常需要使用 base class 的依赖项数量意味着 class 设计有问题。

可以放弃依赖注入并依赖 ES 模块来实现单例,这会导致更少的样板代码但更多的缺点,例如测试。