(アーカイブ)Matreshka.js-MK.Object

この記事は古くなっています。 新しいドキュメントには、この投稿から最も関連する情報が含まれています。 Matreshka.Objectを参照してください。





前回の記事で、マトリョーシカの一般原則、つまり要素、イベント、継承のバインドについて説明しました。 前回の記事の最後で、「アプリケーションの状態(ユーザーにパスワードを表示するかどうか)とアプリケーションデータ(ログイン、パスワード、 "remember me")を区別する方法」を自問しました。



これに役立つクラスは、 Matreshka



クラスを継承するMK.Object



と呼ばれます。 考え方は簡単です。クラスインスタンスのデータを担当するキーが多数あり、他のプロパティはアプリケーションの状態のみを担当し、ビジネスモデルではないと考えています。



いくつのキーが機能するか
多くのキーについては、疑似._keys



プロパティ._keys



。これは、私たちにとって重要ではない値を持つオブジェクトです。 新しいキーを追加する前に、キーが配列内にあるかどうかを確認する必要があり、削除するときにはインデックスを見つけて次の要素をシフトする必要があるため、配列は私たちには適していません。 オブジェクトの場合、行の完全なセットを取得し、その存在を確認する必要のない新しいキーを追加し、 delete



delete



演算子を呼び出すだけで済みます。





データを処理するプロパティを設定するために、 .jset



メソッドが.jset



ます:

 var mkObject = new MK.Object(); mkObject.jset( 'a', 1 ); console.log( mkObject.toJSON() ); // { a: 1 }
      
      







.jsetのドキュメント: finom.github.io/matreshka/docs/Matreshka.Object.html#jset

.ToJSONドキュメントfinom.github.io/matreshka/docs/Matreshka.Object.html#toJSON

これで、通常どおり新しいプロパティを使用できます。

 var mkObject = new MK.Object(); mkObject.jset( 'a', 1 ); mkObject.a = 2; console.log( mkObject.toJSON() ); // { a: 2 }
      
      





特に、 Matreshka



クラスから継承したメソッドを使用できます。

 mkObject.bindNode( 'a', '.my-element' ); mkObject.on( 'change:a', handler );
      
      





.toJSON



メソッドの結果として、キーをキーのセットに追加せずにプロパティを設定した場合.toJSON



このプロパティは表示されません。

 var mkObject = new MK.Object(); mkObject.jset( 'a', 1 ); mkObject.b = 3; console.log( mkObject.toJSON() ); // { a: 1 }
      
      





.addJSONKeys



メソッドを使用して、キーリストにキーを追加できます。

Doc: finom.github.io/matreshka/docs/Matreshka.Object.html#addJSONKeys

 mkObject.addJSONKeys( 'b', 'c' );
      
      





ここで重要なルールがあります。どのプロパティを.toJSON



関数の結果に含めるべきかわからない場合、通常の割り当ての代わりに常に.jset



を使用します。 キーがわかっている場合、個人的には、デフォルトのデータを常に設定することを好みます。

 var MyClass = Class({ 'extends': MK.Object, constructor: function( data ) { this .initMK() .jset({ //    a: 1, b: 2, c: 3 }) .set( data ) //   (data -    ) ; } });
      
      





.initMK



呼び出しに注意して.initMK



。 ここで、彼はイベントオブジェクトと「特別な」プロパティだけでなく、キーのオブジェクトセットも初期化します。 さらに、必要なイベントハンドラーを追加して、データが変更されたときに"modify"



イベントを発生させます。 例:

 var mkObject = new MK.Object(); mkObject.jset({ a: 1, b: 2 }); mkObject.c = 3; mkObject.on( 'modify', function() { alert( 'Data is changed' ); }); mkObject.a = 4; //   mkObject.b = 5; //   mkObject.c = 6; //   ,    "c"  ,  
      
      





引数をオブジェクトとしてクラスに渡すと、データとして解釈されます。

 var mkObject = new MK.Object({ a: 1, b: 2 }); //   ,   var mkObject = new MK.Object(); mkObject.jset({ a: 1, b: 2 });
      
      





.each



メソッドを使用してデータを反復処理できます。

 var mkObject = new MK.Object(); mkObject.jset({ a: 1, b: 2 }); mkObject.c = 3; mkObject.each( function( item, key ) { console.log( key ); }); //  'a', 'b'
      
      





Doc: finom.github.io/matreshka/docs/Matreshka.Object.html#each



.hasOwnProperty



メソッドを使用して、オブジェクトにプロパティがあるかどうかを確認できます

 var mkObject = new MK.Object(); mkObject.jset( 'a', 1 ); mkObject.b = 2; alert( mkObject.hasOwnProperty( 'a' ) ); // true alert( mkObject.hasOwnProperty( 'b' ) ); // false ('b'   )
      
      





これにより、通常のオブジェクトと同様にfor..in



構造を使用できます。

 for( var i in mk ) if( mk.hasOwnProperty( i ) ) { doSomething(i, mk[i]) }
      
      





UPDObject.defineProperty



制限のため、8番目のロバでは機能しません



名前がそれ自体を物語っている多くのメソッドがあります:

.keyOf



。値でキーを検索し、キーを返します(配列の.indexOf



に類似)。

キーの配列を返す.keys





.removeJSONKeys



、データを処理するキーのセットからキーを削除します。



前の記事から修正された例をご覧ください: jsbin.com/disigiza/1/edit

コンストラクターで、デフォルトのデータを設定します。

  ... constructor: function () { this .initMK() .jset({ //   userName: '', password: '', rememberMe: true }) .bindings() .events(); }, ...
      
      





そして、サーバーに送信するオブジェクトを手動で作成する代わりに、 .toJSON



メソッドを呼び出します。

  ... login: function () { if (this.isValid) { alert( JSON.stringify( this.toJSON() ) ); } return this; } ...
      
      







結論として



これで、マトリョーシカのデータを、バックエンドにとって関心のない状態から分離する方法がわかりました。 いいね しかし、大量のデータが必要な場合はどうでしょうか? Backbone.jsの配列またはコレクションのようなもの。 解決策はMK.Array



クラスです。これについては、次の記事で説明します。



最後まで読んでいただきありがとうございます。 すべて良いと良いコーディング。



All Articles