2012-03-08 16 views
0

私は基本クラスの継承のためにmootools 1.4.3を使用しています。私は実際に別のクラスライブラリからいくつかのコードを変換しています。この他のクラスライブラリは、あらかじめ定義された関数名テンプレート(メンバー関数_ _xxxを取得すると、xxxのゲッターを生成する)に基づいてゲッターとセッターを動的に作成します。私はmootoolsと同様のことをしたいと思っていました。私はJavascriptの新機能ではありませんが、より高度な概念にはなじみがありません。自動ゲッター/セッター

私は部分的に動作するようにしました。 Classオブジェクトが定義されているコードでは、クラスパラメータをループし、defineGetterまたはdefineSetterをそれに応じて追加します。

http://jsfiddle.net/Qa2dr/1/

これは素晴らしい作品、それが適切にゲッターとセッターを作成します。それが失敗するところは、子クラスを作成するときです。これらの動的getter/setterは、子クラスに伝播されません。私はこれが可能かどうか、もしそうなら、それがどのように行われているのか分かりません。 MooToolsはクラスとこれらのクラスに上記の変更使用:fooのログで

http://jsfiddle.net/vLyk7/10/

を私はバーのgetterとsetterを見ることができます。 bazのログではquuxのゲッターとセッターを見ることができますが、getterとsetterを親から見たいと思います。繰り返しますが、これを動作させることができれば、このコードの変換に多くの時間を節約できます。

+1

あなたのユースケースを説明してもらえますか?可能なメリットは、自動的に、特定のプロパティにマップするプロトタイプの関数を作成することです。おそらくClass.Mutatorsはゲッター/セッターを受け取るべき変数を宣言できる場所です。 –

+0

基本的には、__get__XXX型と__set__XXX型の関数を持つ既存のコードをいくつか取り、それぞれのコンストラクタで__defineGetter__と__defineSetter__を追加するのではなく、MooToolsを変更してこれらを作成したかったのです。私の試みは多少はうまくいったが、結果として得られる基本クラスgetters/setterは子クラスには利用できない。 – brandon

答えて

0

右。あなたがオブジェクトを拡張するときhttps://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/DefineSetter

は、これらのプロパティに直接アクセスを保護し、プロキシ動作しません:私は、ブラウザが

__defineGetter____defineSetter__がクロス非推奨とされていない、私はあなたがやろうとしているものを手に入れると思いますけど...セッター/ゲッター(新しいオブジェクトのプロパティにアクセスする)は、リスンしている親(プロトタイプオブジェクト)には移動しないためです。

あなたはExtendsのパラメータを調べることができます。新しいClassを設定するときは、新しいparamsオブジェクトからプロトタイプチェーンまでの関数を探し、一致するものがあればsetter/getterを新しいオブジェクトに適用する必要があります。それは容易ではありません...

おそらく:newClass.prototype.parent = parent;の後に、ゲッター/セッターが利用可能になったかどうかをチェックし、リスナーを付けることができるはずです。この時点ですべてのクラスのプロパティをチェックしない限り、おそらく参照を何らかの形で保存することをお勧めします。

代わりに、初期化クラスミューテータをタイプ作成に入れずにリファクタリングして、そこにアイテムを追加することもできますが、元のオブジェクトは使用できない可能性があります。