我正在尝试在Typescript中做一些基本的东西。我已经宣布了这样的课程。由于我想使用类的成员属性,我不想在nameChanged函数中使用this关键字。
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";
使用'this'键盘,我收到编译错误。无法找到符号'反应'。 showReaction属性也是如此,但name的行为与预期的一样。
我错过了什么吗?我怎样才能做出反应,showReaction的行为就像名字一样?
答案 0 :(得分: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"
答案 1 :(得分:0)
访问名称不是指类成员名称。您实际上是在访问全局名称变量。您只能使用this关键字访问类成员。