![]() |
не могу разобраться с типами
простой пример кода:
Код AS3:
почему в третьем трэйсе arr2[0] is Sprite == false? ведь это всё тот же mySprite. буду признателен за разъяснения. |
В третьем трейсе false, потому что там объект равен null, вы его удаляете методом splice:
Код AS3:
|
splice массив возвращает.
|
Цитата:
Код AS3:
Цитата:
|
Цитата:
|
Цитата:
конечно же Код AS3:
|
Цитата:
|
ну это просто из копипаста осталось )
В любом случае это здесь проблемы не создает |
typeof существует в AS только потому, что это часть ECMAScript. Вообще он не нужен / только путает по поводу того, как устроен язык. Этот оператор задумывался для языка где пользовательские типы нельзя создать, а встроенных - всего 6 или сколько-то там, и эти типы "object", "string", "number", "boolean", "function", "undefined" - и вроде все, но может что-то забыл. Ситуация в AS совсем не такая, создание пользовательских типов - обычное дело. Чтобы получить имя класса создавшего объект - используйте getQualifiedClassName(), если нужно получить ссылку на конструктор - (<???> as Object).constructor. <???> замените на ссылку на ваш объект. Кастовать к Object нужно потому что свойство constructor из каких-то непонятных соображений компилятором засекречено.
|
кстати геттер конструктора это свойство прототипа, и можно его определить у себя и в возвращать не себя
|
Цитата:
да и полезность в js typeof также сомнительна, там тоже не так решается определение типа. |
Цитата:
|
В JS чаще всего утиная типизация используется. Грубо говоря, если вам нужно сделать splice, то просто проверяется наличие splice, иначе ошибка-не поддерживается. А является ли он при этом array или чем-то другим-неважно.
а typeof даже встроенные объекты типа date не различает. Код:
if(obj.splice){Цитата:
|
в as не утиная типизация
|
Цитата:
|
Цитата:
Ну так поэтому он и бессмысленный, кроме того, Код:
(typeof(new Boolean())=='object')// true Ладно, оффтопить заканчиваем. |
> еще null забыл.
Код AS3:
|
Цитата:
|
Но компилятор не компиляет, если не привести к динамическому типу.
|
> Оно не засекречено - это прототипное свойство, насколько мне помнится.
Ну так toString(), valueOf() и т.п. можно использовать и без магии, они же тоже объявлены на прототипе. |
UP!
Спасибо, особенно wvxvw! Ок, я обойдусь без typeof. Но второй вопрос остался: почему в третьем трэйсе arr2[0] is Sprite == false? Ведь мы всего лишь из массива arr1 в массив arr2 передали ссылку на один и тот же объект mySprite. Почему при этом Sprite превратился в Object? В этом простейшем примере я конечно могу написать arr2.push(arr1.splice(0, 1)[0] as Sprite); но что делать если заранее мне тип неизвестен? Я всего лишь хочу передать ссылку на объект из одного массива в другой. |
Потому, что в arr2[0] у вас массив, а спрайт уже внутри этого массива.
|
Спасибо! Как обычно, невнимательность! concat мне в помощь.
|
Цитата:
Независимо от того, что Вы там знаете о типе или не знаете — push() массива примет что угодно, и кастовать для него нет никакого смысла. Кастовать надо после, когда заберете объект из массива — чтобы типизированно работать с его более конкретным типом, нежели Object, который возвращается оператором []. Добавлено через 2 минуты Цитата:
|
| Часовой пояс GMT +4, время: 20:49. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.