__defineSetter__だけ上書きしようとしたらダメだった。

原因

prototype に定義してある __defineGetter__ と __defineSetter__ のうち、変更の必要があった __defineSetter__だけを上書きしようとした。

結果

正常に動かなくなりました。(動作はするが正常ではなく、Firebugなどでエラーは返らない)

経緯

今まで ASonJS で _visible を変更する際に、値が変更された時点で style.display をいじっていたために、onRelease 等のユーザーの入力と onEnterFrame 等の内部の処理の間で表示のタイミングが若干ズレてたのが気になっていました。

で、MovieClip と TextField の prototype にしている DisplayObject の _visible の __defineSetter__ を、MovieClipだけ上書きしようとしました。_visible 変更時に内部の値の変更と再描画のフラグだけ立て、実際の描画はenterframeのタイミングで行うようにしようとしました。

解決方法

しばらく悩んだ後、__defineSetter__ だけでなく __defineGetter__ も同時に上書き(getter の動作に変更はないので、DisplayObjectと同じ内容に)してみた所、正常動作するようになりました。どうやら必ずペアで定義する必要があり、片方だけ書き換える事はできないようです。詳しい方がいらっしゃいましたら御教授下さい。

これを書いてみて

ズレが起こるのは、処理のインターバル(enterframe)とユーザーの入力のタイミングがズレた時なので、描画のタイミングを制御するよりも、ユーザーの入力の処理を enterframe のタイミングまで保留するのが正しい解決方法のような気がしました。