这是。'构造函数中的导入成员是否过多?

时间:2018-01-28 09:51:31

标签: typescript angular5

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

import { Component  } from '@angular/core';
import { SomeModule } from '@somewhere';

@Component({ ... })
export class SomeComponent {
  constructor( private _importedModule: SomeModule ) {
   this._importedModule.doesSmethingSpecial();
  }
}

但是,在TypeScript示例中,我经常看到“自我”引用被省略。我的意思是这样的:

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 blood,但是我的代码的审阅者重写它以使用'this'。并评论说我没有正确使用范围。我想知道。我的方法有问题吗?这是不好的方式?如果是的话,我的方法究竟如何搞乱范围?我问我的评论员,答案是 - >研究范围(有用:D)。从我读到的内容来看,我不能说这很糟糕,有多糟糕。

1 个答案:

答案 0 :(得分:4)

你很困惑,你的复兴者似乎也是。首先,构造函数参数不是“导入”。他们是争论。

如果您有这样的构造函数:

constructor(foo: string)

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

如果在参数前添加可见性修饰符(private,protected,public),则 也会成为属性。即这段代码

constructor(private foo: string) {}

等同于此代码:

private foo: string;

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

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