javascript - Varför göra routern privat?


I Angular 2+ (4) routing-handledningen visas det hur man gör router till en privat medlem, t.ex:

constructor(
    private router: Router, // <- router is private
    private heroService: HeroService) { }
    ...
) {}

Men det ger ingen förklaring till varför routern är privat här. Att ha den privat gör det svårare att testa, så vad är anledningen till att den är privat? Är det bara praxis, eller finns det någon säkerhetsaspekt av att ha den offentlig?

Också, specifikt, hur testar man routing, att rätt rutter navigeras till under olika omständigheter? Handledningen nämner inte testning av router/rutter överhuvudtaget?

Svar #1

Att lägga till private, public eller protected lägger implicit till ett klassnivåfält där den skickade konstruktörsparametern tilldelas.

Detta är en TypeScript-funktion för mindre upprepande kod.

Du kan nu komma åt det överförda värdet med

someMethod() {
  this.router...
}

istället för

class MyComponent {
  router:Router;

  constructor(
    router: Router, // <- router is private
    private heroService: HeroService) { }
    ...
  ) {
    this.router = router;
  }

  someMethod() {
    this.router...
  }
}

Om det inte finns någon specifik anledning att göra det public eller protected, är private det rätta alternativet. Det är vad de gjorde.

Svar #2

Inkapsling. Gör dina fält privata och funktionalitet publik. Klienten som använder din klass i detta fall behöver bara veta vad den kan göra, inte hur den gör det.

Det finns 3 åtkomstnivåer i TypeScript, public, private, protected. Dessa nyckelord stöds endast på TypeScript-nivå.

Om du gör din variable/function privat, kommer den inte att vara synlig utanför klassen.

Om du gör din variabel/funktion publik, kommer den att vara synlig utanför klassen.

Om du gör din variable/function protected kommer den bara vara synlig i klassen själv och i alla klasser som ärver den klassen.