Просмотр полной версии : Где находиться конструктор свойств мувика, типа _xscale?
chingachgoog
25.12.2007, 21:04
ASSetPropFlags(MovieClip.prototype, null, null, 1);
for (var i in MovieClip.prototype) {
trace(i+" = "+MovieClip.prototype[i]);
}
Данное перечисление дает ряд свойств, типа
enabled = true
useHandCursor = true
Их можно легко подправить:
MovieClip.prototype.enabled=false
Теперь все мувики не работают как кнопки.
Но. В перечислении нет свойств типа _xscale, _focusrect и т.п.,
а хочется сделать что-то вроде:
MovieClip.prototype._focusrect=false
Но так не срабатывает.
chingachgoog
25.12.2007, 22:24
А нельзя встроенные сеттер/геттеры переопределить типа addProperty?
И еще: а где все же храняться дефолтные значения встроенных геттер/сеттеров?
chingachgoog
26.12.2007, 13:35
Странно,
i=0
j=0
MovieClip.prototype.getMethod = function() {
trace("get "+i)
i++
return this._focusrect1;
};
MovieClip.prototype.setMethod = function(par) {
this._focusrect1=par
trace("set "+j)
j++
};
MovieClip.prototype.addProperty("_focusrect1", MovieClip.prototype.getMethod, MovieClip.prototype.setMethod)
createEmptyMovieClip("m1",1)
trace(m1._focusrect1)
m1._focusrect1=123
Трейс показывает, что геттер/сеттер вызывался 64 раза каждый.
Выводим m1._focusrect1, это вызывает метод getMethod, который возращает this._focusrect1, который вызывает getMethod, который возращает ... и так далее.
chingachgoog
26.12.2007, 13:58
Это обычная ситуация с addProperty?
И почему только 64 раза?
Пример
MovieClip.prototype.getX = function () {
return this._x;
};
MovieClip.prototype.setX = function (val) {
this._x = val;
};
MovieClip.prototype.addProperty ("x", MovieClip.prototype.getX, MovieClip.prototype.setX);
createEmptyMovieClip ("m1", 1);
trace (m1.x);
m1.x = 123;
trace (m1.x);
Как видите, "снаружи" я обращаюсь к x, а "внутри" работаю с _x.
Почему 64 - не знаю.
Вероятно глубина рекурсии установлена в 64 итерации.
chingachgoog
26.12.2007, 16:21
Все же геттер/сеттер можно задать по нужному дефолту, вот что у меня получилось:
MovieClip.prototype.onEnterFrame=function(){
this.__proto__=Object.prototype
trace(this)
this._alpha=50 // меняем любое геттер/сеттер свойство на нужное значение
}
createEmptyMovieClip("m1",1)
setTimeout(function(){
trace(m1._alpha)
trace(typeof(m1))
},50)
Про классы и наследование слышали?
chingachgoog
26.12.2007, 17:05
По-моему это очевидно, глядя на код :)
Если есть вариант проще или изящнее - подскажите, если мой вариант содержит ужасную потенциальную ошибку или проблему - какую именно?
add:
строка this.__proto__=Object.prototype используется тут из-за обработчика onEnterFrame - т.к. иначе будет постоянно переопределяться свойства мувиклипов, а не единожды как задумывалось. При изменении же ссылки __proto__ (это ссылка на ОБЪЕКТ - прототип конструктора), onEnterFrame останется лишь на прототипе конструктора MovieClip, и не будет исполняться на экземплярах класса MovieClip.
MovieClip.prototype.onEnterFrame=function(){
this.__proto__=Object.prototype
trace("this="+this)
this._alpha=50 // меняем любое геттер/сеттер свойство на нужное значение
}
Впрочем, в данном коде происходит одно неприятное событие - переопределяется и _level0, чтобы этого не происходило надо добавить условие:
MovieClip.prototype.onEnterFrame=function(){
this.__proto__=Object.prototype
if (this!=_root){
this._alpha=50 // меняем любое геттер/сеттер свойство на нужное значение
}
}
Все! Код назначает любые дефолтные геттер-сеттер свойства мувиков, причем любых мувиков - как созданных программно, так и вручную уже присутствовавших на сцене.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.