对于构造函数中的导入成员'this.'是否过多?



在 Angular2+ 示例中,我经常看到在构造函数中作为参数传递的导入模块由"this."符号引用。这对我来说确实是有意义的,因为他们是班级的成员,因此应该可以通过班级的"自我"访问。所以一般来说,代码看起来像这样:

import { Component  } from '@angular/core';
import { SomeModule } from '@somewhere';
@Component({ ... })
export class SomeComponent {
  constructor( private _importedModule: SomeModule ) {
   this._importedModule.doesSmethingSpecial();
  }
}

但是,在TypeScript示例中,我经常看到省略了"self"引用。我的意思是这样的:

new_member_from_outside = is_something_external;
class SomeClass extends Something { 
        some_variable: some_type; 
        constructor( new_member_from_outside ) {
            this.some_variable = new_member_from_outside.doingSomethingSpecial();
        }
    }

因此,我开始在我的 Angular2+ 代码中使用它,如下所示:

import { Component  } from '@angular/core';
import { SomeModule } from '@somewhere';
@Component({ ... })
export class SomeComponent {
  constructor( private _importedModule: SomeModule ) {
   _importedModule.doesSomethingSpecial();
  }
}

代码有效,没有错误,我的 IDE 中没有 linter 血,但我的代码的审阅者将其重写为使用"this."并评论我没有正确使用范围。我纳闷。我的方法有问题吗?这是不礼貌的吗?如果是,我的方法究竟是如何弄乱范围?我问了我的审稿人,答案是 ->研究范围(有用的:D(。从我读到的内容来看,我真的不能说这很糟糕,它有多糟糕。

你很困惑,你的评论者似乎也很困惑。首先,构造函数参数不是"导入"。它们是论据。

如果你有一个这样的构造函数:

constructor(foo: string)

那么foo是一个论点,而且只是一个论点。它不是对象的属性。因此,使用this.foo将是一个错误。它只是一个常规参数,仅在构造函数内部可见(即局部变量(。

如果在参数前面添加可见性修饰符(私有、受保护、公共(,则它也将成为属性。 即此代码

constructor(private foo: string) {}

等效于此代码:

private foo: string;
constructor(private foo: string) {
  this.foo = foo;
}

因此,在这样的构造函数中,foo既是可用于foo的局部变量,也是可用于this.foo的私有属性。两个变量引用相同的值,因此使用 foo.length(例如(或this.foo.length是等效的。

最新更新