1

サーバー側コンポーネントを使用して JavaScript アプリケーションに取り組んでいます。目的は、複数のブラウザー間で同期される (つまり、同じ外観を持つ) キャンバス上に複数の異なるオブジェクトを持つことです。同期は、個々の変更をすべてのブラウザーにブロードキャストするサーバー側コンポーネントによって行われます。オブジェクトが変更されるたびに、サーバーに通知する必要があります。サーバーは、他のブラウザーへの通知を処理します。

キャンバス上のオブジェクトは、属性がユーザーの外観を決定する JavaScript オブジェクトによって表されます。もちろん、すべての属性が外観にとって重要なわけではありません。したがって、重要な属性の変更のみを他のブラウザに送信する必要があります。オブジェクトにはさまざまな「クラス」がありますが、すべてのオブジェクトは共通の「スーパークラス」から「継承」します (クラス継承の用語は JavaScript では実際には機能しませんが、この場合はその方が簡単だと思います) .

さて、クライアントサーバー通知をエレガントな方法で送信するのに問題があります。現在、さまざまなオブジェクトのすべての重要な属性のセッター メソッドがあります。これらのセッター メソッドは、通知をサーバーに送信する関数を呼び出します。

多くの定型コードが導入されるため、私はそのソリューションがあまり好きではありません。理想的には、新しいオブジェクトを作成するときに、重要な属性を指定してそれを処理できるようにしたいと考えています。これらの属性の変更を監視するロジックは、「スーパークラス」内にある可能性があります。しかし、これを実装する方法がわかりません。実行時にセッターを動的に構築する方法はあるのでしょうか? それとも、私が考えていなかった他の方法があるのでしょうか?

誰かがこの問題の解決策を考えることができれば、私はそれについて聞いてうれしいです.

前もって感謝します!

編集:

受け入れられた回答を取り消す必要がありました(を介してゲッターとセッターを動的に作成するObject.defineProperty)。これで問題が解決すると思っていましたが、実際にはそうではありませんでした。セッターを起動する直接属性割り当てを介してプロパティが変更されたときに通知を受けるようになりました。

SynchronizedObject.importantProp = 'someValue';

しかし、気づいたように、多くの場合、importantPropはより複雑なオブジェクトです。そして、これらのオブジェクトは通常、セッターではなくゲッターを介して更新されます。

SynchronizedObject.importantProp.x = 'someValue';

私が見る限り、動的なゲッター/セッターの実装でこのように行われた変更に気付く機会はありません。それを使用するには、オブジェクトへのアクセス方法を変更する必要があります。うまくいくもの:

prop = SynchronizedObject.importantProp;
prop.x = 'someValue';
SynchronizedObject.importantProp = prop;

そうすれば、セッターが使用され、すべてがうまくいきます。しかし、これは非常に厄介で、毎回同期について考える必要はありません。プロパティを設定します。だから私には思えますが、このソリューションは実際には使用できません。

誰でも助けることができますか?

4

3 に答える 3

2

1つのset機能はどうですか?

MyObj.prototype.set = function(key, value) {
    this[key] = value;
    // do other things
};

EventEmitter これを実装と組み合わせて、変更を簡単に観察できるようにすることができます。

于 2013-03-08T17:53:42.643 に答える
1

これはまさに__defineSetter()__サポートすることを意図したものです。いくつかの良い例については、 John Ressig のJavaScript Getters and Setters ブログ投稿を参照してください。セッター内からイベントを発生させるのは非常に簡単です。

于 2013-03-08T23:04:54.743 に答える
0

車輪の再発明が本当にあなたのバッグではない場合は、 MeteorJSフレームワークを検討することをお勧めします。

于 2013-03-08T17:56:09.910 に答える