PDA

Просмотр полной версии : Создание безымянного объекта (не работает)


ethereal999
16.03.2006, 02:30
Есть такой код из Пеннера:
Color.prototype.setBrightness = function (bright){
var trans = this.getTransform();
with (trans){
ra = ga = ba = 100 - Math.abs (bright);
rb = gb = bb = (bright > 0) ? bright * (256/100) : 0;
}
this.setTransform (trans);
}

MovieClip.prototype.setBrightness = function (bright){
(new Color(this)).setBrightness (bright);
}

mc.setBrightness (50);
так Флэш говорит, что нет такого метода для Color (хотя я только что его создал). А вот такой код работает:
MovieClip.prototype.setBrightness = function (bright){
var c = new Color (this);
c.setBrightness (bright);
}

mc.setBrightness (50);
Вопрос: так почему не работает конструкция (new Color(this)) для вновь созданного метода ?

Король
16.03.2006, 02:49
Эксперимент показал, что такой синтаксис (*new Smth().func()*) работает только с экземплярами Object
почему - самому интересно

ethereal999
16.03.2006, 09:22
ну раз уж заговорил про Color, то я немного переработал метод Пеннера с учетом того, что в 8-ке Color не приветствуется:
import flash.geom.Transform;
import flash.geom.ColorTransform;

MovieClip.prototype.setBrightness = function (bright){
var mult = 1 - Math.abs (bright) / 100;
var offset = (bright > 0) ? bright * 2.56 : 0;
(new Transform (this)).colorTransform = new ColorTransform (mult, mult, mult, this._alpha / 100, offset, offset, offset, 0);
}

mc.setBrightness (50);

Король
16.03.2006, 09:27
это конечно клево, но это не объясняет.
подождем матерых теоретиков.

andr64
16.03.2006, 19:06
а так?Color.prototype.setBrightness = function(bright) {
var trans = this.getTransform();
with (trans) {
ra = ga=ba=100-Math.abs(bright);
rb = gb=bb=(bright>0) ? bright*(256/100) : 0;
}
this.setTransform(trans);
};
MovieClip.prototype.setBrightness = function(bright) {
Object(new Color(this)).setBrightness(bright);
};
mc.setBrightness(50);

Король
16.03.2006, 20:04
andr64, я тебе могу написать 300 способов реализовать этот алгоритм, но ни один из них не является объяснением того, почему не работает самый первый.

__i
16.03.2006, 20:38
гы, интересно девки пляшуть %(

если вызывать методы Color которые определены по умолчанию то все работает.

silin
16.03.2006, 20:53
Есть такой код из Пеннера:
Color.prototype.setBrightness = function (bright){
var trans = this.getTransform();
with (trans){
ra = ga = ba = 100 - Math.abs (bright);
rb = gb = bb = (bright > 0) ? bright * (256/100) : 0;
}
this.setTransform (trans);
}

MovieClip.prototype.setBrightness = function (bright){
(new Color(this)).setBrightness (bright);
}

mc.setBrightness (50);
так Флэш говорит, что нет такого метода для Color (хотя я только что его создал). А вот такой код работает:
MovieClip.prototype.setBrightness = function (bright){
var c = new Color (this);
c.setBrightness (bright);
}

mc.setBrightness (50);
Вопрос: так почему не работает конструкция (new Color(this)) для вновь созданного метода ?

типичные придирки AS2 компилятора: класс не динамический - ничего не добавишь..,
компилируем как AS1 и все ОК.
зы: второй вариант проходит, потому что var c не типизирована (проверки нет), поставь var c : Color и получишь тот же еррор..
зыы:проходит и такой вариант (компилятор 'не знает' чего вызываем):
MovieClip.prototype.setBrightness = function (bright){
(new Color(this))["setBrightness"] (bright);
}

ethereal999
16.03.2006, 20:54
andr64
Отлищщно ! Спасибо, дружище.

silin ох уж эти заковыристости...