2017-03-03 21 views
0

インスタンス変数を参照するときに毎回 "this"キーワードを使用する必要があるかどうかを知りたいと思います。 Javaから来て、私は別のスコープの同じ名前を持つ別の変数がある場合にのみ "this"を使用します(this.arg = argなど)。しかしTypescriptのすべてのチュートリアルでは、インスタンス変数(public studentName:string;)が参照されるたびに人々が "this"を使用するようです。だから私は、同じ名前の引数なしで簡単な方法で作業する必要がある場合、私は真剣に実行する必要があります。Angular2、Typescriptクラスの変数と "this"の使用

let nameOfTheStudent=this.studentName; 

最初、私は「この」すべての時間を混乱書きたくない場合は?

+0

変数がグローバルである場合は、 'this'キーワードを使用する必要があります。 'let'を使うことはできますが、関数内で宣言された変数(ローカル変数)に対してのみ使用できます。 –

+1

[this](https://github.com/Microsoft/TypeScript/wiki/'this--in-TypeScript)は、javascriptとtypescriptのコンテキストで 'this'を理解するのに役立ちます –

答えて

3

はい、クラスフィールドにアクセスする場合は、this.fieldを使用する必要があります。それは本当に短く退屈な答えですが、ここではいくつかの文脈があります。

JavaScript/TypeScriptクラスの重要な点は、既存のプロトタイプベースのオブジェクトシステムの構文砂糖に過ぎないことです。例えば、コードのこれら2つの機能的に同等です:あなたは活字体コンパイラによって出力されるJavaScriptを見れば実際に

// ===== Class syntax ===== 

class MyClass { 
    myField: string; 

    constructor() { 
     this.myField = "Hello, world!"; 
    } 

    myMethod() { 
     return this.myField; 
    } 
} 

let myInstance = new MyClass(); 

// ===== Prototype syntax ===== 

function MyClass() { 
    this.myField = "Hello, world!"; 
} 

MyClass.prototype.myMethod = function() { 
    return this.myField; 
}; 

let myInstance = new MyClass(); 

、後者の例では、(与えるか、または取る)表示されますおそらく何です。実際には、コード内でクラスフィールドを使用することはできますが、JavaScriptには実際にはコンセプトがありません。コンストラクタ関数のプロパティを取得して設定するだけです。

クラスが通常の関数とは異なる構文規則を持つのではなく、可能な限り既存の規則とのマッピングを維持し、クラス構文を最小限に保つように仕様が設計されました。このため、JavaやC#と異なり、thisを指定する必要があります。

関連する問題