Внутри членов класса, this
относится к текущему экземпляру, к которому была вызвана функция-член (поэтому он всегда того же типа, что и класс). Например, если у вас был класс Twang с функцией-членом func
:
var twang1:Twang = new Twang();
twang1.func(); // Inside func(), "this" will refer to twang1
Flash сначала создает сцену (типа Stage
), на которой все остальное должно быть размещено (прямо или косвенно). Затем он создает экземпляр класса вашего документа и помещает его на сцену как ребенок. Таким образом, this
в вашем коде никогда не может ссылаться на сцену, поскольку вы не написали класс Stage
.
Поскольку дерево отображения во Flash является иерархическим, при добавлении чего-либо к дочернему объекту, который уже находится на сцене (по крайней мере косвенно), оно будет отображаться на экране. Таким образом, разница между this.addChild()
и stage.addChild()
заключается в том, в какой контейнер будет вставлен объект.
При передаче this
в конструктор другого объекта он будет иметь тип класса, в котором определен метод (который использует this
); так что в этом случае это будет тип класса документа.
Вместо того, чтобы передавать контейнеры экранных объектов другим объектам, чтобы они могли добавлять в него дочерние элементы, вы можете иметь классы, наследуемые от Sprite (или некоторых других DisplayObjectContainer
), и добавлять дочерние элементы к самим . Затем вы можете добавить созданный вами объект (который будет содержать подобъекты) к себе (к экземпляру класса документа), который находится на сцене. Это также дает гораздо лучшую инкапсуляцию.
Обратите внимание, что если вы хотите добавить детей на сцену напрямую, вам не нужно передавать сцену этим объектам; у них уже есть свойство stage
только для этой цели. Единственная хитрость в этом свойстве состоит в том, что оно равно нулю, пока объект фактически не добавлен на сцену; Итак, вам нужен слушатель событий:
public class Car : Sprite {
public Car() {
this.addChild(new Wheel()); // Add to self
this.addEventListener(event.ADDED_TO_STAGE, populateStage);
}
private function populateStage():void {
stage.addChild(new RandomThingToAddToStage());
}
}
Наконец, обратите внимание, что вам не нужно указывать this
в большинстве случаев. Следующие две строки эквивалентны (в методе класса):
addChild(foo);
this.addChild(foo);