Форум 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

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

Krusty 24.07.2012 17:28

Цитата:

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

еще null забыл.
да и полезность в js typeof также сомнительна, там тоже не так решается определение типа.

Bgg 24.07.2012 17:34

Цитата:

Сообщение от Krusty (Сообщение 1089748)
да и полезность в js typeof также сомнительна, там тоже не так решается определение типа.

А как там решается определение типа?

Krusty 24.07.2012 17:52

В JS чаще всего утиная типизация используется. Грубо говоря, если вам нужно сделать splice, то просто проверяется наличие splice, иначе ошибка-не поддерживается. А является ли он при этом array или чем-то другим-неважно.
а typeof даже встроенные объекты типа date не различает.
Код:

if(obj.splice){
// я массив или что-то похожее, я умею делать splice
}else{
// неведома зверюшка.
}

Цитата:

Утиная типизация основана на одной известной пословице: «If it looks like a duck, swims like a duck and quacks like a duck, then it probably is a duck (who cares what it really is)».

В переводе: «Если это выглядит как утка, плавает как утка и крякает как утка, то, вероятно, это утка (какая разница, что это на самом деле)».

Aquahawk 24.07.2012 17:58

в as не утиная типизация

Bgg 24.07.2012 18:34

Цитата:

Сообщение от Krusty (Сообщение 1089755)
В JS чаще всего утиная типизация используется. Грубо говоря, если вам нужно сделать splice, то просто проверяется наличие splice, иначе ошибка-не поддерживается. А является ли он при этом array или чем-то другим-неважно.

typeof для простых типов, а не для Date. Определить Date можно с помощью instanceof, в прочем как и массив.

Krusty 24.07.2012 20:24

Цитата:

Сообщение от Bgg (Сообщение 1089762)
typeof для простых типов, а не для Date. Определить Date можно с помощью instanceof, в прочем как и массив.

Само собой.
Ну так поэтому он и бессмысленный, кроме того,
Код:

(typeof(new Boolean())=='object')// true
(typeof(null)=='object')// true

что вообще делает всю затею ненужной.
Ладно, оффтопить заканчиваем.

wvxvw 24.07.2012 21:53

> еще null забыл.
Код AS3:

typeof null == "object"


i.o. 25.07.2012 00:09

Цитата:

Сообщение от wvxvw (Сообщение 1089728)
Кастовать к Object нужно потому что свойство constructor из каких-то непонятных соображений компилятором засекречено.

Оно не засекречено - это прототипное свойство, насколько мне помнится.

dimarik 25.07.2012 01:24

Но компилятор не компиляет, если не привести к динамическому типу.

wvxvw 25.07.2012 02:57

> Оно не засекречено - это прототипное свойство, насколько мне помнится.
Ну так toString(), valueOf() и т.п. можно использовать и без магии, они же тоже объявлены на прототипе.

filepark 26.07.2012 11:44

UP!
Спасибо, особенно wvxvw! Ок, я обойдусь без typeof.
Но второй вопрос остался: почему в третьем трэйсе arr2[0] is Sprite == false? Ведь мы всего лишь из массива arr1 в массив arr2 передали ссылку на один и тот же объект mySprite. Почему при этом Sprite превратился в Object?

В этом простейшем примере я конечно могу написать arr2.push(arr1.splice(0, 1)[0] as Sprite); но что делать если заранее мне тип неизвестен? Я всего лишь хочу передать ссылку на объект из одного массива в другой.

alatar 26.07.2012 11:53

Потому, что в arr2[0] у вас массив, а спрайт уже внутри этого массива.

filepark 26.07.2012 11:57

Спасибо! Как обычно, невнимательность! concat мне в помощь.

Wolsh 26.07.2012 12:12

Цитата:

я конечно могу написать arr2.push(arr1.splice(0, 1)[0] as Sprite); но что делать если заранее мне тип неизвестен?
Еще раз повторю, что от кастинга здесь ничего кроме подсказки тому, кто пытается разобрать код.
Независимо от того, что Вы там знаете о типе или не знаете — push() массива примет что угодно, и кастовать для него нет никакого смысла.
Кастовать надо после, когда заберете объект из массива — чтобы типизированно работать с его более конкретным типом, нежели Object, который возвращается оператором [].

Добавлено через 2 минуты
Цитата:

Сообщение от caseyryan (Сообщение 1089707)
В любом случае это здесь проблемы не создает

Как видите, создает проблемы в умах читающих форум.


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

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