引き続き、Ext.defineの話。
クラス定義を行った後に、動的にメンバ定義を行うための手法をご説明します。
通常、クラス定義を行う際にExt.extendの時も、オブジェクトリテラルで定義して終わりでした。
JavaScriptなので、無理矢理追加することも可能でしたが、Ext JS 4 からは、これらの操作を行うためのメソッドが用意されています。
そのメソッドとは、extendです。
あれ?Ext.extend復活??いいえ、違います。定義したクラスオブジェクトのメソッドになります。
次のコードをご覧ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<span style="color:#990000;">// {{{ extendCls</span> Ext.define(<span style="color:#009900;">'extendCls'</span>, { }); <span style="color:#990000;">// }}}</span> <span style="color:#990000;">// {{{ afterAddedStaticMethod</span> extendCls.extend(<span style="color:#009900;">'afterAddedStaticMethod'</span>, <span style="color:#000099;">function</span>() { console.log(<span style="color:#009900;">"afterAddedStaticMethod"</span>); }); <span style="color:#990000;">// }}}</span> <span style="color:#990000;">// {{{ Object Style</span> extendCls.extend({ <span style="color:#990000;">// {{{ afterAddedStaticMethodObjectStyle</span> afterAddedStaticMethodObjectStyle :<span style="color:#000099;">function</span>() { console.log(<span style="color:#009900;">"afterAddedStaticMethodObjectStyle"</span>); } <span style="color:#990000;">// }}}</span> }); extendCls.afterAddedStaticMethod(); <span style="color:#990000;">// "afterAddedStaticMethod"</span> extendCls.afterAddedStaticMethodObjectStyle(); <span style="color:#990000;">// "afterAddedStaticMethodObjectStyle"</span> <span style="color:#990000;">// }}}</span> |
追加のやり方は、key/valueの順に設定する方法と、オブジェクト指定して複数指定する方法の2種類が提供されます。
利用するコード部分をお気づきになりましたか?そうです、このextendメソッドは、静的メンバを動的に追加するためのメソッドです。
これでは、クラス定義のstaticsを動的に設定できるだけです。ここから、本番です。
メンバ定義を後から動的に行うメソッド、それは、implimentです。
早速、上記のコードの後ろに追加して、動的にメンバを実装してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<span style="color:#990000;">// {{{ afterAddedDynamicMethod</span> extendCls.implement(<span style="color:#009900;">'afterAddedDynamicMethod'</span>, <span style="color:#000099;">function</span>() { console.log(<span style="color:#009900;">"afterAddedDynamicMethod"</span>); }); <span style="color:#990000;">// }}}</span> <span style="color:#990000;">// {{{ Object Style</span> extendCls.implement({ <span style="color:#990000;">// {{{ afterAddedDynamicMethodObjectStyle</span> afterAddedDynamicMethodObjectStyle : <span style="color:#000099;">function</span>() { console.log(<span style="color:#009900;">"afterAddedDynamicMethodObjectStyle"</span>); } <span style="color:#990000;">// }}}</span> }); <span style="color:#000099;">var</span> EC = <span style="color:#000099;">new</span> extendCls(); EC.afterAddedDynamicMethod(); <span style="color:#990000;">// "afterAddedDynamicMethod"</span> EC.afterAddedDynamicMethodObjectStyle(); <span style="color:#990000;">// "afterAddedDynamicMethodObjectStyle"</span> <span style="color:#990000;">// }}}</span> |
利用方法は、extendとimplementは、同じですね。
2つの違いを理解して、ケースバイケースで利用することで、柔軟な設計が可能になりそうですね。
Ext.defineを利用したクラス生成:メンバ定義を後から行う – Ext JS 4