Это довольно фундаментальное понятие в программировании, что будет делать много вещей труднее сделать, пока вы не поймете, это хорошо, и это довольно трудно объяснить, не начиная с некоторыми наработками:
Что здесь происходит легче говорить с обычной старой 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
, 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,
... }
, затем, наконец, .correct
получает значение "b"
.
Вы также должны знать, что this
специальная переменная, которая имеет особое значение в ActionScript (и JavaScript, на котором она основана): она широко относится к объекту, когда код, который вы пишете внутри: для «глобального» кода (не внутри a function
), var
добавляет свойства этому объекту: var number = 2;
и this.number = 2
здесь. (Это не верно, когда вы находитесь в function
, this
ведет себя по-разному там, иногда в очень странным образом, так что будьте осторожны!)
Теперь вы можете начать видеть, что происходит: когда вы используете []
, например, question1["number"]
, а не question1.number
, вы передаете имя свойства, которое хотите получить как String
значение, что означает, что вы можете изменить какое свойство вы получаете во время работы, а не при компиляции («runtime» vs. «compiletime» "), но это также позволяет вам получать свойства с именами, с которыми вы не можете ссылаться с синтаксисом .
!
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
}
}
Есть много больше, что вы можете сделать с массивами, поэтому читайте их, когда вы получите время.
Спасибо тонну! Очень ясно!! – user2434923