2014-05-02 6 views
0

Я пытаюсь сделать некоторые основные вещи в TypScript. Я объявил класс таким образом. Поскольку я хочу использовать свойства элемента класса, я не хочу использовать это ключевое слово в функции nameChanged.Typcript, почему доступны только некоторые свойства?

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 устанавливал «где» для поиска функций и свойств объектов. Без него все будет глобальным (точнее, он будет искать цепочку областей для запрошенного объявления переменной). И, в 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; 

Выход будет:

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

Доступ к имени не относится к имени члена класса. вы фактически получаете доступ к глобальной переменной имени. Вы можете получить доступ только к членам класса, используя это ключевое слово.

Смежные вопросы