Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   onEnterFrame: delete vs null (http://www.flasher.ru/forum/showthread.php?t=112593)

TanaTiX 02.06.2008 19:32

onEnterFrame: delete vs null
 
Код:

this.onEnterFrame=null;
delete this.onEnterFrame;

Две нижеприведенные строчки казалось бы выполняют одно и тоже. По крайней мере мне так какзлось до определенного момента. Хотелось бы услышать про отличия в их работе, когда какой из вариантов следует использовать. У меня почему-то в некоторых случаях работает только 1й вариант (могу привести конкретные примеры, но хотелось бы понять суть их работы, поэтому я пока послушаю теорию, и если не осилю - буду упрощать свою задачу и предлагать конкретный код)
Заранее спасибо.

Alex_beginner 02.06.2008 19:40

Ну насколько известно первая строчка инициализирует метод-событие текущей временной шкалы, но не присваивает ему конкретной инстанции.
Вторая строчка предназначена для полного удаления метода-события.
Вообще то эти две строчки совсем разные.

TanaTiX 02.06.2008 19:48

Т.е. в 1с варианте сама функция onEnterFrame не исчезает? Т.е функция продолжает работать, возвращая "ничего"? Тогда есть ли смысл в такой конструкции?

Alex_beginner 02.06.2008 20:09

В такой конструкции вообщем-то смысла нет, а вот в прединициализации свойств есть. Вот например в классе для присваивания свойству не динамического класса, необходимо предварительно инициализировать свойство, т.е.

Код:

class MyClass
{
      private var myProp:Number = null;
      function MyClass(myProp:Number)
        {
              this.myProp = myProp;//конструктор класса
        }
}


Так вот если не выполнить прединициализацию свойства myProp компилятор выдаст ошибку.

А вообще-то null означает "пустое" значение. Оно нужно если мы нехотим передавать никакое значение значение параметра в функцию. Или, допустим в какой-то момент мы незнаем значение переменной, но в данном конкретном месте ее прединициализация целесообразна из соображений контроля типов, ну и тд.
Однозначно пользуйтесь delete

TanaTiX 02.06.2008 21:09

Alex_beginner, спасибо за исчерпывающий ответ.

silin 02.06.2008 23:08

Alex_beginner, инициализации при объявлении вовсе необязательна, достаточно и var myProp:Number;
кстати, поправь свой пример, объявить свойство класса как this.myProp:Number = null; никак не выйдет

ps: onEnterFrame не нуждается ни в инициализации, ни даже в объявлении поскольку речь все же о наследниках MovieClip,
т.е. такой класс, например, не вызовет ошибки:
Код:

class MyClass extends MovieClip
{
        public function MyClass(myEnterFrame:Function)
        {
                onEnterFrame = myEnterFrame;
        }
}


etc 02.06.2008 23:12

Несколько раз обсуждалось это. Использовать нужно delete.

Alex_beginner 03.06.2008 10:16

silin! Красивый реверанс)). Вы не забывайте Вы создали подкласс от MovieClip, в нем инициализирован этот метод(onEnterFrame). А здесь Вы его просто переопределяете. Пожалуйста, мою мысль некаверкайте и людей с толку несбивайте.

chingachgoog 03.06.2008 11:34

Код:

onEnterFrame=null

trace(hasOwnProperty("onEnterFrame")) // true

delete onEnterFrame

trace(hasOwnProperty("onEnterFrame")) // false


silin 03.06.2008 12:17

Цитата:

Сообщение от Alex_beginner (Сообщение 743328)
silin! Красивый реверанс)). Вы не забывайте Вы создали подкласс от MovieClip, в нем инициализирован этот метод(onEnterFrame). А здесь Вы его просто переопределяете. Пожалуйста, мою мысль некаверкайте и людей с толку несбивайте.

сори, не имел намерения каверкать Вашу мысль, а только уточнить некоторые нюансы с инициализацией:
-инициализация при объявлении не нужна, а в некоторых случаях и вредна (инициализация непримитивных типов в AS2 приводит к неприятному косяку)
-поскольку вопрос был об onEnterFrame, то логично и говорить об наследниках MovieClip, у которых onEnterFrame уже есть (какой смысл в "прединициализации" в этом контексте не очень понятно)
-onEnterFrame в MovieClip не инициализирован (undefined), а только объявлен, но этого достаточно

ps. дискутировать не стану, нечего обсуждать

Alex_beginner 03.06.2008 12:33

Верно! Дискутировать неочем, я рассказывал в начале TanaTix о null, а не о onEnterFrame (см. выше). Об onEnterFrame я "заикнулся" в конце поста.
Цитата:

onEnterFrame в MovieClip не инициализирован (undefined), а только объявлен, но этого достаточно
Слово "объявлен" лучше подходит к тому что я имел ввиду. Тут вы правы.
Но приводить такой пример, где скрыта идея об объявлении от вопрошающих, было дело скорее запутывающее их, нежели раскрывающее сакральный смысл объявления и инициализации свойств. Теперь люди будут думать, что такое возможно - без предварительного объявления создать в нединамическом классе свойство или метод (синтаксис АС2).

silin 03.06.2008 14:06

ну наконец-то люди перестанут так думать..
а кто все же не образумится, будет жестоко обломан компилятором

Alex_beginner 03.06.2008 14:32

Об этом я говорил выше!!:):D Но мы то должны им еще до компилятора разъяснить, а то нашим разъяснениям грош цена:)

chingachgoog 03.06.2008 15:33

Цитата:

Сообщение от Alex_beginner (Сообщение 743369)
Теперь люди будут думать, что такое возможно - без предварительного объявления создать в нединамическом классе свойство или метод (синтаксис АС2).

В этом нет ничего невозможного.

Цитата:

Сообщение от silin
а кто все же не образумится, будет жестоко обломан компилятором

Замечательно, что проверка "верности" кода компилятором настолько же тупа, как и сама идея такой проверки. Т.е. компилятор можно запросто надуть.

silin 03.06.2008 15:42

а кто все же не образумится, будет жестоко обломан компилятором, если канешно не нападет на него первым..

Alex_beginner 03.06.2008 15:43

chingachgoog!
А обоснование в примерах.
А потом зачем вообще компилятор надувать - он призван помочь Вам не далать грубых ошибок. Он вроде соседа который напомнил Вам, что Вы забыли ключи от квартиры (пример Колина Мука).

silin 03.06.2008 15:49

ээ.., так это ж не я..
по всем вопросам обмана тупого компилятора к chingachgoog, плс

Alex_beginner 03.06.2008 15:56

silin!!:taunt::taunt::D:taunt:
Прошу прощенья!

chingachgoog 03.06.2008 17:05

Цитата:

Сообщение от Alex_beginner (Сообщение 743436)
chingachgoog!
А обоснование в примерах.

Давайте, ваш пример. А я покажу как компилятор надуть :)

Цитата:

Сообщение от Alex_beginner (Сообщение 743436)
А потом зачем вообще компилятор надувать - он призван помочь Вам не далать грубых ошибок. Он вроде соседа который напомнил Вам, что Вы забыли ключи от квартиры (пример Колина Мука).

А если не забыл? Если я ключи специально не взял? А этот тупой сосед меня не пускает на улицу без ключей? Я ему спасибо должен сказать?

Alex_beginner 03.06.2008 17:14

chingachgoog!
В этой ситуации, обход компилятора дело нужное, не спорю.
Но таких ситуаций относительно немного. Тогда, как ситуаций, когда этот "сосед" находит из 10 000 куб.м кода мелкую ошибку (не логическую), поверьте, он сильно облегчает Вам жизнь, сокращая Ваш поиск данной конкретной ошибки до минимума.


Цитата:

Давайте, ваш пример. А я покажу как компилятор надуть
А то, что касается примера, то Вы упустили логическую цепочку нашего разговора, а именно, Вы (не я) утверждали, что без предварительного объявления создать в нединамическом классе свойство или метод (синтаксис АС2) вполне возможно, обманув компилятор. Посему, Вы и должны представить код, доказывающий Вашу правоту.

chingachgoog 03.06.2008 17:54

Код:

class stat{
        var prop=function(ee){
                this["z"]=ee
        }
}


Alex_beginner 03.06.2008 18:27

Согласен. С помощью синтаксиса доступа [] можно создать сие свойство.
Но ведь с помощью [] можно получить доступ даже к приватным свойствам и методам класса (баг), т.е. "увенчаные" директивой private, другое дело нужно ли это, если есть официальный синтаксис. А то все перемешается сразу динамические классы, нединамические итд.

etc 03.06.2008 18:33

AS2 не существует. Существует конвертер AS2 в AS1 и все, а посему ничего удивительного и странного в том, что нет прав доступа и прочих фич, нет.

chingachgoog 03.06.2008 18:40

__etc, а что, компилятор AS3 так не проведешь?

etc 03.06.2008 18:44

Цитата:

Сообщение от chingachgoog (Сообщение 743497)
__etc, а что, компилятор AS3 так не проведешь?

Конечно нет. Даже если и проведете, то получите ошибку уже в runtime.

chingachgoog 03.06.2008 19:10

Ну значит это дело времени - пока AVM2 еще не распотрошили как AVM1 :)

etc 03.06.2008 19:30

Цитата:

Сообщение от chingachgoog (Сообщение 743505)
Ну значит это дело времени - пока AVM2 еще не распотрошили как AVM1 :)

Это вы не распотрошили.


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

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