Меняем константы где захотим.
Запись от Aquahawk размещена 21.03.2012 в 04:05
Немного магии рантайма.
Иллюстрация того что можно менять константы объекта. Их менять можно только в конструкторе. Но вот ссылку на конструктор можно сохранить. И получить немного магии.
Ловкость рук и никакого мошенничества. Код валиден и не генерирует варнингов в строгом режиме компиляци.
package { import flash.display.Sprite; public class Main extends Sprite { public function Main():void { var test:ConstTest = new ConstTest(15); trace(test.constValue); test.setConstValue(10); // some magic :) trace(test.constValue); test.setConstValue(20); trace(test.constValue); } } }
package { public class ConstTest extends ConstTestBase { private var _construcorMethod:Function; private var _inited:Boolean = false; private var _tempValue:int = 0; public const constValue:int = 0; public function ConstTest(someParam:int = 0) { // Можем юзать любые параметры. Но обязательно задать значение по умолчанию if (!this._inited) { super(); //NOTE: ОБЯЗАТЕЛЬНО. иначе компилятор сам добавить вызов конструктора предка выше и он будет вызываться много раз. this._construcorMethod = arguments.callee; this._inited = true; // обычный код коструктора который нам нужен trace("ConstTest constructed, param:",someParam); } else { this["constValue"] = this._tempValue; //NOTE: в строгом режиме компиляци явно менять константы нельзя вообще, поэтому перенесём резолвинг в рантайм. } } public function setConstValue(value:int):void { this._tempValue = value; this._construcorMethod(); } } }
package { public class ConstTestBase { public function ConstTestBase() { trace("ConstTestBase constructed"); // Это чтоб показать что конструктор предка вызывается корректно } } }
Код:
ConstTestBase constructed ConstTest constructed, param: 15 0 10 20
Всего комментариев 15
Комментарии
21.03.2012 15:40 | |
Мне кажется, автор просто показал, что есть и как можно сделать. А-ля идиотизмы Блуда.
|
21.03.2012 16:01 | |
Цитата:
Мне кажется, автор просто показал, что есть и как можно сделать. А-ля идиотизмы Блуда.
Цитата:
Вот если бы можно было взять произвольный класс, расширить его, получить super() и так далее..
Тут другой вопрос в том что константы объекта они не статические, и соответственно наследуются. Однако изменить их значения из конструктора наследника не дают. Проверил. |
|
Обновил(-а) Aquahawk 21.03.2012 в 16:04
|
21.03.2012 16:06 | |
На самом деле я просто увидел http://jacksondunstan.com/articles/1774 и был возмущён тем что там написано. Откомментил ему и решил до кучи сюда написать. А придумал я это ещё осенью в качестве разминки для мозгов.
Цитата:
А где вообще применимы константы, где неприменимы геттеры?
|
|
Обновил(-а) Aquahawk 21.03.2012 в 16:09
|
21.03.2012 17:50 | |
21.03.2012 18:22 | |
Мне твой трюк с сохранением конструктора понравился, кстати.
|
21.03.2012 18:29 | |
Аналогичным образом можно и на сеттеры и на геттеры ссылку получить.
|
24.03.2012 16:28 | |
оч круто! респект.
Конструктор можно проще получить. this.constructor |
24.03.2012 23:17 | |
ну ваще это не магия, а запланированная фича. всё работает по спеке ES. даже синтаксис специальный для этого есть, но увы компилятор у нас не такой умный как положено.
|
25.03.2012 00:29 | |
Цитата:
всё работает по спеке ES.
dimarik Неправду говорите. Будет: Код:
[class Main] Это в джаваскрипте так будет, как вы сказали(правда там классов то нет как таковых). Или в AS если вы создадите объект как new someFunction(), которая возвращает что-то. Вот тогда этому объекту(динамическому) будет приписана эта функция в свойство конструктор. Ещё точно можно определить такой геттер у не динамического класса, и можно просто переписать это свойство у динамического. Создавать у не динамического поле с таким именем я не пробовал. |
Последние записи от Aquahawk
- Мини головоломка про троичность двоичного. (09.10.2012)
- Создание инстанса объекта без статической инициализации класса. (10.09.2012)
- Меняем константы где захотим. (21.03.2012)
- Сортируем 300 000 Number быстро, ещё быстрее. (11.06.2011)