AS3: Как упростить код Action Script 3?

Вот пример, который я должен использовать, когда хочу создать кнопку с эффектом наведения мыши:

    this.buttonExample.buttonMode = true;
    this.buttonExample.useHandCursor = true;
    this.buttonExample.addEventListener(MouseEvent.CLICK,myaction);

Я новичок в AS3 - есть ли способ упростить этот код следующим образом:

    this.buttonExample.buttonMode = true;.useHandCursor = true;.addEventListener(MouseEvent.CLICK,myaction);

почему не работает?


person funny_pete    schedule 07.05.2010    source источник
comment
Я согласен с s.harvey, вы не можете просто придумывать вещи и ожидать, что это сработает.   -  person davr    schedule 11.05.2010


Ответы (4)


Это уже настолько просто, насколько это возможно. Во-первых

this.buttonExample.buttonMode = true;
this.buttonExample.useHandCursor = true;
this.buttonExample.addEventListener(MouseEvent.CLICK,myaction)

намного читабельнее, чем

this.buttonExample.buttonMode = true;.useHandCursor = true;.addEventListener(MouseEvent.CLICK,myaction);

Всегда стремитесь к удобочитаемости, а не ко всему остальному. А во-вторых,

this.buttonExample.buttonMode = true; 

не возвращает объект, поэтому вы не можете ни с чем взаимодействовать.

person Paul Bevis    schedule 07.05.2010

Если вы часто используете этот шаблон, вы можете создать вспомогательную функцию:

public function setAsButton(button:Sprite, clickHandler:Function):void {
  button.buttonMode = button.userHandCursor = true;
  button.addEventListener(MouseEvent.CLICK, clickHandler);
}

Затем назовите это где-нибудь:

setAsButton(this.buttonExample, myaction);
person Shiki    schedule 07.05.2010
comment
И вы можете опустить «это». - person bitc; 07.05.2010
comment
я бы сделал еще один шаг и создал класс var btn:Btn = new Btn(btnExample); btn.addEventListener(... - person maxmc; 07.05.2010

Если вы чувствуете, что набирать this.buttonExample снова и снова слишком сложно, просто назначьте этот объект переменной и используйте эту переменную в остальных операторах:

var b : Button = this.buttonExample;
b.buttonMode = true;
b.useHandCursor = true;
b.addEventListener(...);

Как уже упоминалось, есть также оператор with, но его использование не рекомендуется, поскольку это затрудняет чтение кода и может привести к странным результатам:

with (this.buttonExample) {
  buttonMode = true;
  useHandCursor = true;
  addEventListener(...);
}

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

var b : Button = this.buttonExample;
b.buttonMode = b.useHandCursor = true;
b.addEventListener(...);

Будьте очень осторожны, чтобы присваивать цепочки таким образом только в том случае, если назначенное значение является неизменяемым (например, true, false, числа и строки, но не массивы или большинство других объектов), потому что один и тот же объект будет назначен всем переменным с левой стороны. Если значение неизменно, это не имеет значения, но если оно изменчиво, вы можете получить странные результаты, как в этом примере:

 a = b = [ ];
 a.push(1);
 b.push(2);
 trace(a); // outputs 1, 2
 trace(b); // also outputs 1, 2

Причина такого результата заключается в том, что a и b ссылаются на один и тот же массив, а поскольку массивы изменяемы, не имеет значения, как вы обращаетесь к объекту, он все равно будет изменен. a и b не ссылаются на разные массивы только потому, что это разные переменные.

Вы можете подумать, что можете сделать что-то вроде следующего, но это не сработает.

// this will NOT work
var b : Button = this.buttonExample;
(b.buttonMode = b.useHandCursor = true).addEventListener(...);

Причина, по которой можно сказать b.buttonMode = b.useHandCursor = true, но не добавить .addEventListener(...), заключается в том, что значением выражения присваивания (например, b.buttonMode = true) является значение, присвоенное левой части (например, true). Если вы добавите к этому .addEventListener(...), вы, по сути, скажете true.addEventListener(...), что явно не то, что вам нужно. Другими словами

b.buttonMode = b.useHandCursor = false;

эквивалентно

b.useHandCursor = false;
b.buttonMode = b.useHandCursor;

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

person Theo    schedule 07.05.2010

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

также у вас может быть несколько заданий:

this.buttonExample.buttonMode = this.buttonExample.useHandCursor = true;

иногда это полезно, но ради удобочитаемости не следует злоупотреблять этим.

приветствие
back2dos

person back2dos    schedule 07.05.2010
comment
Я также где-то читал, что в AS3 есть проблемы с производительностью. - person Shiki; 07.05.2010
comment
@Shiki: этого не должно быть, когда доступ к свойствам осуществляется строго типизированным образом, но в противном случае разрешение свойств, конечно, становится довольно дорогим. - person back2dos; 07.05.2010
comment
@Richards: это означает, что во время компиляции компилятор знает тип владельца свойства, так что известный тип определяет свойство. Рассмотрим class A { public var a:int; }. И теперь var a:A = new A(); var o:* = a; В этом случае a.a будет работать значительно лучше, чем o.a, потому что компилятор (в данном случае JIT) может вычислить смещение свойства на основе имеющейся у него информации, тогда как во втором примере это должно быть разрешено с помощью отражения во время выполнения. - person back2dos; 09.11.2010