2017-03-03 83 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和輸入腳本的上下文中理解'this' –

回答

3

是的,如果您想訪問班級字段,則必須使用this.field。儘管如此,這是一個非常短暫和無聊的答案,所以這裏有一些背景。

關於JavaScript/TypeScript類的一個重要事項是,它們只是現有的基於原型的對象系統的語法糖。例如,這些兩段代碼在功能上等同:

// ===== 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中,後者的例子可能是什麼,你會看到(給予或採取)。所以實際上,雖然你可以在你的代碼中使用類字段,但JavaScript並沒有任何概念 - 你只是在構造函數中獲取和設置屬性。

該規範不是讓類對正常函數有不同的語法規則,而是儘可能保持映射與現有規則一致,並保持類語法最小。這就是爲什麼你必須指定this,與Java或C#不同。