为什么让路由器私有?

时间:2017-09-07 07:30:15

标签: javascript angular typescript angular-router

在Angular 2+(4)routing tutorial中,它显示使router成为私人成员,例如:

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

但它没有提供关于为什么路由器在这里是私有的任何解释。私有化使得测试更加困难,那么它是私有的原因是什么?它只是最佳实践,还是有一些安全隐含的公开?

另外,具体来说,如何测试路由,在不同情况下导航到正确的路由?本教程没有提到测试路由器/路由的所有

3 个答案:

答案 0 :(得分:2)

添加privatepublicprotected隐式添加了一个类级别字段,其中传递了构造函数参数。

这是一个TypeScript功能,用于较少的样板。

您现在可以使用

访问传递的值
someMethod() {
  this.router...
}

而不是

class MyComponent {
  router:Router;

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

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

如果没有具体原因publicprotectedprivate是正确的选择。这就是他们所做的。

答案 1 :(得分:1)

封装。使您的字段私有和功能公开。使用您的class in this case的客户只需知道它可以做什么,而不知道它是怎么做的。

TypeScript中有3个访问级别public, private, protected。仅在Typescript级别支持这些关键字。

如果您将variable/function 设为私​​人,则该课程外 将不可见

如果您将variable/function 公开,则会在课堂外显示

如果您使variable/function 受保护,则仅在类本身和任何继承该类的类中可见

答案 2 :(得分:1)

这个特定示例中的路由器并不特别......在OOP中,问题总是“这应该被外部代码作为这个类的公共接口的一部分来访问吗?”你是否期望router来自ctrl.router以外的其他任何地方?如果没有,那么保持private是唯一谨慎的做法。将公开的公共接口限制为仅包含真正必要的部分,可以更容易地找出使用的内容,并在以后根据需要重构它,因为没有外部代码绑定到它。