使用ES6类语法在控制器中分配依赖项

时间:2015-03-25 17:32:56

标签: javascript angularjs ecmascript-6

在ng-conf 2015(Angular 1.3 meets Angular 2.0)的视频中,使用ES6类作为控制器的语法如下所示:

class UnicornHype {
  constructor(unicornHorn, $q) {
    this.$q = $q;
    this.horn = unicornHorn
  }

  findUnicorn {
    return this.$q((resolve, reject) => {
      ...
      this.horn.thrust();
      ...
    });
  }
}

我看到注入的依赖项被指定为实例属性,我想知道这是否是一个很好的方法。由于控制器的依赖关系通常是单例服务,它们不应该由实例共享吗?

他们这样做的原因是以前在$scope上(因此在构造函数体中)的方法现在在对象的共享原型上。 John Papa's style guide实际上直接将它们分配给this(虽然他没有使用ES6类 - 但这并不重要,因为它们只是构造函数的语法糖{ {1}}东西)。这是个好主意吗?

另一种方法是将方法保留在原型上,但将依赖项分配给局部变量(假设每个控制器都在自己的模块文件中)。类似的东西:

prototype

这样更好吗?如果是,var q, horn; class UnicornHype { constructor(unicornHorn, $q) { [q, horn] = [$q, unicornHorn]; } findUnicorn { return q(...); } } 实际上会优于const吗?这种方法有任何缺点吗?

此处描述了第三种方法(使用var):Writing AngularJS Apps Using ES6。我是否应该忘记上面提到的所有内容并以这种方式进行?

1 个答案:

答案 0 :(得分:0)

我真的不明白为什么他们使用Weakmaps。 我引用:

  

选择WeakMap背后的原因是,一旦对象被垃圾收集,将删除具有对象作为键的WeakMap条目。

但不是长期服务吗?那你为什么需要确保垃圾收集?

在javascript中,所有非基元都是指向原始实例的指针,因此始终共享依赖关系。那么为什么实例变量方法不是一个好主意?

无论如何,我认为实例变量方法似乎是最具前瞻性的方法。