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

Assigning dependencies in controllers using the ES6 class syntax

本文关键字:分配 依赖 控制器 ES6 语法 使用      更新时间:2023-09-26

在ng conf 2015的一段视频中(Angular 1.3符合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的风格指南实际上直接将它们分配给this(尽管他没有使用ES6类,但这并不重要,因为它们只是构造函数prototype的语法糖)。这是个好主意吗?

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

var q, horn;
class UnicornHype {
  constructor(unicornHorn, $q) {
    [q, horn] = [$q, unicornHorn];
  }
  findUnicorn {
    return q(...);
  }
}

这样更好吗?如果是的话,const实际上会比var更好吗?这种方法有缺点吗?

这里描述了第三种方法(使用WeakMaps):使用ES6编写AngularJS应用程序。我应该忘记上面说的一切,这样做吗?

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

选择WeakMap的原因是,一旦对象被垃圾收集,WeakMap中以对象为键的条目就会被删除。

但是服务不是很长寿吗?那么,为什么需要确保垃圾收集呢?

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

无论如何,我认为实例变量方法似乎是最经得起未来考验的方法。