Macromedia Flash 5. Объектно - ориентированное программирование




Super - запуск конструкторов - часть 2


Теперь о втором "усложнении". Пользователь ДОЛЖЕН ставить this.super( ... ) первой строкой любого конструктора. Никакого волшебства. Есть много способов проверить, есть ли у того или иного конструктора вызов super или нет и, в случае, если такового не наблюдается, вставить его. К сожалению, нам никак не обойтись без того, чтобы запустить этот конструктор, а в некоторых случаях это может привести к отклонению от нужного нам курса - представьте себе, что мы ввели новую статичную переменную, следящую за тем, сколько всего экземпляров было создано. Ну да ладно, мы ещё поквитаемся! Теперь необходимо, чтобы пользователь вставлял выражение this.super( ) первой строкой каждого конструктора. Вы спросите: "возникнет ли ошибка, если мы не станем этого делать?" (подобно тому, как это организовано в JAVA) Ну что тут скажешь! Работа с многоцелевыми библиотеками ActionScript требует жертв.

Итак, перейдём к самому процессу. Сначала передаём аргументы вверх по цепи конструктора, а затем запускаем конструкторы в порядке сверху вниз. После этого super немного изменяется. Теперь выражение выглядит так - parent.prototype, совсем как в JAVA, так что у вас есть доступ к перезаписанному свойству или методу посредством использования выражение this.super.xxx( ). Проверьте, понимаете ли вы всё что происходит в этой цепи. (Я - почти понимаю, но ведь это всё я написал...) (В будущем: я должен объяснить это немного лучше :) ).

// SUPER ---------------------- Object.customKeyword.prototype.super = function() { // this.super(); должно стоять первой строкой всех конструкторов

// счётчик get chain - сообщает нам (по мере продвижения вверх // по цепочке конструкторов), сколько раз был // вызван super с тех пор, как был создан новый пример // Это также увеличивает счётчик.

var count = Object.customKeyword.prototype.super.prototype.cnt++;

// находим следующий конструктор var fn = this.__proto__.__proto__; while(count-- > 0) { fn = fn.__proto__; } fn = fn.constructor;

// вызываем этот конструктор в экземпляр, передаём аргументы this.$_base = fn; this.$_base( arguments[0],arguments[1], arguments[2],arguments[3], arguments[4],arguments[5], arguments[6],arguments[7] ); delete this.$_base;

// проверяем, действительно ли мы в начале цепи if(fn.prototype.__proto__ == Object.customKeyword.prototype) { // если да, перезаписываем значение super // для этого экземпляра, // теперь super указывает на родительный прототип, // таким образом можно вызвать перезагруженные // функции и вернуть их аргументы this.super = this.__proto__.__proto__.prototype; // обнуляем счётчик цепи для следующего экземпляра Object.customKeyword.prototype.super.prototype.cnt = 0; } } Object.customKeyword.prototype.super.prototype.cnt = 0;

<<

   ООП во Flash 5    >>




Содержание  Назад  Вперед