Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   не могу разобраться с типами (http://www.flasher.ru/forum/showthread.php?t=182473)

filepark 24.07.2012 09:17

не могу разобраться с типами
 
простой пример кода:
Код AS3:

var mySprite:Sprite = new Sprite();
trace('trace_1', typeof mySprite, mySprite is Sprite)//trace_1 object true
var arr1:Array = [];
arr1.push(mySprite);
trace('trace_2', typeof arr1[0], arr1[0] is Sprite)//trace_2 object true
var arr2:Array = [];
arr2.push(arr1.splice(0, 1));
trace('trace_3', typeof arr2[0], arr2[0] is Sprite)//trace_3 object false

почему в первом трэйсе тип Object, почему не Sprite?
почему в третьем трэйсе arr2[0] is Sprite == false? ведь это всё тот же mySprite.

буду признателен за разъяснения.

Deimos747 24.07.2012 09:43

В третьем трейсе false, потому что там объект равен null, вы его удаляете методом splice:
Код AS3:

arr2.push(arr1.splice(0, 1));


udaaff 24.07.2012 09:54

splice массив возвращает.

caseyryan 24.07.2012 10:54

Цитата:

почему в третьем трэйсе arr2[0] is Sprite == false? ведь это всё тот же mySprite.
Могу предположить, что это происходит потому, что он изначально туда попадает не как спрайт, а просто как объект, так как массив не типизирован. Если добавить так:
Код AS3:

arr2.push(arr1.splice(0, 1) as Sprite);

то скорее всего будет true (хотя не проверял).

Цитата:

почему в первом трэйсе тип Object, почему не Sprite?
потому что оператор typeof создан для других целей, он в принципе не может вернуть Sprite

udaaff 24.07.2012 11:05

Цитата:

Сообщение от caseyryan (Сообщение 1089680)
Могу предположить, что это происходит потому, что он изначально туда попадает не как спрайт, а просто как объект, так как массив не типизирован. Если добавить так:
Код AS3:

arr2.push(arr1.splice(0, 1) as Sprite);

то скорее всего будет true (хотя не проверял).

splice массив возвращает.

caseyryan 24.07.2012 11:07

Цитата:

splice массив возвращает.
упс, сорри, не обратил внимания
конечно же
Код AS3:

arr2.push(arr1.splice(0, 1)[0] as Sprite);


Wolsh 24.07.2012 12:42

Цитата:

конечно же...
А кастинг здесь зачем?))))

caseyryan 24.07.2012 12:56

ну это просто из копипаста осталось )
В любом случае это здесь проблемы не создает

wvxvw 24.07.2012 15:15

typeof существует в AS только потому, что это часть ECMAScript. Вообще он не нужен / только путает по поводу того, как устроен язык. Этот оператор задумывался для языка где пользовательские типы нельзя создать, а встроенных - всего 6 или сколько-то там, и эти типы "object", "string", "number", "boolean", "function", "undefined" - и вроде все, но может что-то забыл. Ситуация в AS совсем не такая, создание пользовательских типов - обычное дело. Чтобы получить имя класса создавшего объект - используйте getQualifiedClassName(), если нужно получить ссылку на конструктор - (<???> as Object).constructor. <???> замените на ссылку на ваш объект. Кастовать к Object нужно потому что свойство constructor из каких-то непонятных соображений компилятором засекречено.

Aquahawk 24.07.2012 16:58

кстати геттер конструктора это свойство прототипа, и можно его определить у себя и в возвращать не себя


Часовой пояс GMT +4, время: 17:24.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.