在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。我是否应该忘记上面提到的所有内容并以这种方式进行?
答案 0 :(得分:0)
我真的不明白为什么他们使用Weakmaps。 我引用:
选择WeakMap背后的原因是,一旦对象被垃圾收集,将删除具有对象作为键的WeakMap条目。
但不是长期服务吗?那你为什么需要确保垃圾收集?
在javascript中,所有非基元都是指向原始实例的指针,因此始终共享依赖关系。那么为什么实例变量方法不是一个好主意?
无论如何,我认为实例变量方法似乎是最具前瞻性的方法。