我有许多以“Question”开头的字符串变量,然后以数字结尾。 ( “问题1”) 每个变量都有一个问题(“它说E多少次?”) 在舞台上有一个可编辑的文本框,用户在其中输入要在不同文本框中显示的问题编号。 ( “1”) 当用户单击按钮时,我希望 Question1 的文本应显示在文本框中。 我的代码如下所示:
var Question1:String = "How many times does it say E?" ;
var Question2:String = "How many times does it say B?" ;
var Question3:String = "How many times does it say A?" ;
myButton.addEventListener(MouseEvent.CLICK, displayQuestion);
function displayQuestion(event:MouseEvent):void
{
var QuestionNumber:Number = Number(userInputQuestionNumber.text);
textBoxDisplayQuestion.text= Question(QuestionNumber);
}
如何让 textBoxDisplayQuestion 显示问题的实际文本? (我现在的代码显然不起作用!!)
但是这个例子似乎不起作用:我创建了一个名为 Question 的类,这里是代码:
import Question;
var QuNoLoad:Number;
var Qu1:Question = new Question(1,"how","yes","no","maybe","so","AnsB","AnsA");
trace(Qu1.QuNo, Qu1.Qu, Qu1.AnsA,Qu1.AnsB, Qu1.AnsC, Qu1.AnsD, Qu1.CorAns, Qu1.FaCorAns);
//the following is the code for the button
loadQu.addEventListener(MouseEvent.CLICK, loadQuClick);
function loadQuClick(event:MouseEvent):void
{
//this sets the variable "QuNoLoad" with the contents of the "textBoxQuLoad"
//imagine the user inputed "1"
QuNoLoad=Number(textBoxQuLoad.text);
//this SHOULD!! display the contents of "Qu1.Qu"
textQu.text= this["Qu"+QuNoLoad.toString()+".Qu"]
//and when i traced this statment the value was "undefined"
}
为什么???
答案 0 :(得分:2)
您可以使用方括号[]
运算符按名称引用变量,例如:
this["Question" + QuestionNumber.toString()]
您可以使用此运算符动态设置和检索对象属性的值。
将问题编号保留为整数,您的函数将是:
var Question1:String = "How many times does it say E?" ;
var Question2:String = "How many times does it say B?" ;
var Question3:String = "How many times does it say A?" ;
function displayQuestion(event:MouseEvent):void
{
var QuestionNumber:uint = uint(userInputQuestionNumber.text);
textBoxDisplayQuestion.text = this["Question" + QuestionNumber.toString()];
}
答案 1 :(得分:1)
这是编程中一个非常基本的概念,在你理解它之前会让很多事情变得更难,而且如果不从一些基础开始就很难解释:
这里发生的事情最容易与普通的Object
而不是类进行讨论,所以让我们从一个非常简单的例子开始:
var question1:Object = new Object();
question1.number = 1;
请注意,对于Object
,您不必提前number
存在,它会在您设置时创建。现在,当你说question1.number
时你得到1,显然。然而,首先question1
获取存储在变量 question1
({ number: 1 }
)中的值,会发生什么,然后.number
获取存储在该值中的属性 number
中的值:1
。
要保存一些打字,您可以使用名为“对象文字”的简写:
var question1 = {
number: 1
};
现在让我们尝试一个更复杂的对象:
var question1 = {
number: 1,
text: "How many times does it say A?",
answers: {
a: 1,
b: 2,
c: 3,
d: 4,
correct: "b"
}
};
现在question1
是一个包含3个属性的对象,其中一个属性answers
是一个具有5个属性的对象:a
,b
,{{1} },c
和d
。这也可以写成:
correct
现在应该很清楚为什么文字语法存在!
这一次,如果您说var question1 = new Object();
question1.number = 1;
question1.text = "How many times does it say A?";
question1.answers = new Object();
question1.answers.a = 1;
question1.answers.b = 2;
question1.answers.c = 3;
question1.answers.d = 4;
question1.answers.correct = "b";
,则question1.answers.correct
:"b"
question1
{ number: 1,
获取}
... .answers
值,然后{ a: 1, b: 2,
1}}获取}
... .correct
值,最后"b"
获取this
值。
您还应该知道function
是一个特殊的变量,它在ActionScript(以及它所基于的JavaScript)中具有特定的含义:它广泛指的是当时的对象您正在编写的代码在内部:对于“全局”代码(不在var
内),var number = 2;
为此对象添加属性:this.number = 2
和function
在此处相同。 (当你在this
时,这是不为真,[]
在那里行为有所不同,有时以非常奇怪的方式,所以要小心!)
现在您可能会开始看到正在发生的事情:当您使用question1["number"]
时,例如question1.number
而不是String
时,您将传递要获取的属性名称{ {1}} 值,这意味着您可以在运行时更改所获得的属性,而不是在编译时(“运行时”与“编译时”相比),但也< / em>允许您使用.
语法获取无法引用的名称的属性!
var strange = {
"a strange name? That's OK!": 1
};
trace(strange["a strange name? That's OK!"]);
因此,当您编写this["Qu" + QuNoLoad.toString() + ".QuNo"]
时,您创建了一个名为"Qu2.QuNo"
的名称,例如,您正在尝试获取具有该确切名称的属性,包括.
,但不是存在!您尝试执行的操作相当于:Qu2.QuNo
可以写为this["Qu" + QuNoLoad].QuNo
。
我不应该不说,但是,对于类似这样的事情,我会使用数组,这样就可以使用单个名称来存储值列表:
var questions:Array = [ // set questions to an array with multiple questions
new Question(...),
new Question(...),
...
];
for each (var question:Question in questions) { // Look at each question in the array
if (question.QuNo == textBoxQuLoad.text) { // If this is the right question
loadQuestion(question);
break; // Found it, stop looking at each question by "breaking out" of the for each
}
}
你可以使用阵列做更多的事情,所以当你有时间时,请阅读它们。