2014-05-02 69 views
0

我想在Typescript中做一些基本的東西。我已經宣佈了一個這樣的課程。由於我想使用類的成員屬性,我不想在nameChanged函數中使用this關鍵字。Typescript,爲什麼只有一些屬性可以訪問?

class testController { 
     constructor() 
     { 
     } 
     reaction:string = "trist"; 
     name:string = "erik"; 
     showReaction:boolean = false; 

     nameChanged() 
     { 
      if(name=="olle") 
      { 
       this.reaction = "Yippie"; 
       this.showReaction = true; 
      } 
      else { this.showReaction = false; } 
     } 

    } 

如果我寫的行

 this.reaction = "Yippie"; 

whitout的 '這個' keywork我得到一個編譯錯誤。找不到符號「反應」。 showReaction屬性的作用相同,但名稱的行爲與預期相同。

我錯過了什麼嗎?我怎樣才能做出反應,showReaction的行爲如同名字?

回答

1

與JavaScript一樣,TypeScript需要this上下文來建立「where」來定位對象上的函數和屬性。沒有它,一切都將是全局的(更準確地說,它會搜索範圍鏈中的所需變量聲明)。而且,在TypeScript中,編譯器會捕獲嘗試使用全局變量的實例,但未定義。

與其他語言(如C#)不同,在類的實例方法中不存在默認上下文(由使用確定的隱式this)。當需要引用實例方法和屬性時,您需要明確並使用this

如果name作品不使用this.name,這將意味着有一個全球性的name別處定義的在你的類中定義的函數上下文之外。例如,它可能是這樣的:

var name: string="global"; 
class Test { 
    name: string; 
    public helloName():string { 
     return "hello " + name; 
    } 
} 

var t = new Test(); 
t.name = "instance"; 

var result = t.helloName(); // result = "hello global" 

如果函數體進行了修改,參考this.name

return "hello " + this.name; 

輸出將是:

​​
0

訪問名稱不是指類成員名稱。您實際上正在訪問全局名稱變量。您只能使用this關鍵字訪問類成員。

相關問題