6
var obj = {};
obj.a = 1; // fire event, property "a" added 

この質問は、すでに宣言されているプロパティがいつ変更されたかを検出する方法が議論されているthis oneとは異なります。

4

3 に答える 3

0

オブジェクトのプロパティを数えて、最後にチェックしたときから変更されているかどうかを確認できます。

JavaScriptでオブジェクトのキー/プロパティの数を効率的にカウントするにはどうすればよいですか?

これは大まかな回避策であり、言語で機能の適切なサポートが見つからない場合に使用します。

于 2012-10-01T18:07:40.637 に答える
0

これは技術的には可能ですが、私が知っている現在の JS 実装はすべてシングル スレッドであるため、あまりエレガントではありません。私が考えることができる唯一のことは、力ずくの間隔です:

var checkObj = (function(watchObj)
{
    var initialMap = {},allProps = [],prop;
    for (prop in watchObj)
    {
        if (watchObj.hasOwnProperty(prop))
        {//make tracer object: basically clone it
            initialMap[prop] = watchObj[prop];
            allProps.push(prop);//keep an array mapper
        }
    }
    return function()
    {
        var currentProps = [];
        for (prop in watchObj)
        {
            if (watchObj.hasOwnProperty(prop))
            {//iterate the object again, compare
                if (watchObj[prop] !== initialMap[prop])
                {//type andvalue check!
                    console.log(initialMap[prop] + ' => ' watchObj[prop]);
                    //diff found, deal with it whichever way you see fit
                }
                currentProps.push(prop);
            }
        }
        //we're not done yet!
        if (currentProps.length < allProps.length)
        {
            console.log('some prop was deleted');
            //loop through arrays to find out which one
        }
    };
})(someObjectToTrack);
var watchInterval = setInterval(checkObj,100);//check every .1 seconds?

これにより、オブジェクトをある程度追跡することができますが、繰り返しになりますが、これを 10/秒で実行するにはかなりの作業が必要です。おそらく、オブジェクトも間隔の間に数回変更されます。
全体として、これは理想的とは言えないアプローチのように感じます...おそらく、JSON.stringify'ed オブジェクトの文字列定数を比較する方が簡単でしょうが、それは関数を見逃すことを意味します。この例ではそれらを除外します) プロトタイプ プロパティ。

ある時点で同様のことを検討しましたが、最終的には、問題のオブジェクトを変更したイベント ハンドラーを使用して変更を確認することになりました。
または、DOMElement を作成して、それにonchangeリスナーをアタッチすることもできます...残念ながら、関数/メソッドを追跡するのは難しいかもしれませんが、少なくとも上記のコードほどスクリプトの速度が低下することはありません。 .

于 2012-10-01T18:25:26.603 に答える