2017-09-19 4 views
0

オブジェクトまたは配列にゲッターとセッターを設定する関数があります。 私の問題は、設定された値がオブジェクトである場合、内部的な変更を検出することはできませんが、ゲッターを介してアクセスされると仮定してアクセスされた場合のみです。ゲッターがオブジェクトを返す瞬間、ゲッターを戻した後にアクションを実行したいのですが、それは変更されたかどうかです。現時点ではゲッターから戻った後にアクションを実行する

私のコードは:

set = function(obj, i, val) { 
    Object.defineProperty(obj, i, { 
     set(newVal) { 
      val = newVal 
      // react to changes 
      insert(val, i) 
     }, 
     get() { 
      return val 
      //I want this to run after the object was accessed and possibly changed 
      if (typeof val == "object") { 
       insert(val, i) 
      } 
     }, 
     configurable: true, 
     enumerable: true 
    }) 
} 

私はセッターとゲッターは、setTimeoutを、不要な動作を引き起こす可能性が削除され、私はむしろコードが同期残ってしまうしかし場合のsetTimeoutある一つの解決策を考えています。

私が考えている別のアイデアは、すべてのオブジェクトプロパティでセッターとゲッタを定義することですが、これは高価になります。

どうすればこの問題を解決できますか?私はsetTimeoutをある一つの解決策を考えている

+0

* "setterとgetterが削除された場合、setTimeoutは望ましくない動作を引き起こす可能性があります" * Huh? –

+0

オブジェクトをフリーズするか、Immutablejsのようなライブラリを使用することができます。オブジェクトを更新できる唯一の方法は、再度設定することです。 –

+0

これはX/Yの問題のように聞こえる。あなたが解決しようとしている根本的な問題は何ですか? –

答えて

1

...、あなたがそれを行うだろうかというかPromise.resolve().then(...)をだ

...と私はむしろコードは同期したままです。

は、は同期できません。ゲッターが戻った後にアクションを実行することも、同期させることもできます。あなたはそれを両方向に持つことはできません。言っ


、ゲッターが使用された直後、非同期何かをすると、オブジェクトで行うものを検出することを一切保証はありません。考えてみましょう:

var o = yourObject.theProperty; 
setTimeout(function() { 
    o.foo = "bar"; 
}, 6000); 

theProperty上のあなたのゲッターは最初の行で実行されます。オブジェクトは6秒後まで変更されません。

オブジェクトに対しての変更が検出された場合は、すべてのプロパティーを再構成できないゲッター/セッタープロパティーを作成し、表示された変更に対応します。

オブジェクトに定義されていないプロパティを持つことができるようにするには、それらの変更にも対応したい場合は、それには、Proxyを使用する必要があります。しかし、既知のプロパティセットでは、設定不可能なgetter/setterプロパティがその仕事をします。

関連する問題