OK、Web アプリケーションの巨大なフォームに加えられた変更を追跡しようとしています。ページが読み込まれると、すべての入力フィールド (選択、ラジオ ボタン、チェックボックスなど) の初期状態を「キャプチャ」する JS オブジェクトを作成します。
ユーザーが文字通り何百もの入力要素のいずれかの値を変更すると、新しい値が 2 番目のオブジェクトで追跡されます。ユーザーが をクリックするUpdate
と、これら 2 つのオブジェクトが比較され、変更された値のみが送信され、それに応じてデータが更新されます。
2 つの完全に別個のオブジェクトを構築するのではなく、継承を使用する方が賢明だと考えました。
var initialState = getInitialState();//eg:{bar:'1',foo:'bar',atom:'bomb',some:{nested:'objects'}}
var tracker = Object.create(initialState);
物事が進むにつれて、tracker
オブジェクトは次のようになります。
{bar:'0',foo:'bar',atom:'peace',some:{nested:'objects'}}
FF と chrome でこのオブジェクトを呼び出すJSON.stringify
と、すべて問題なく、オブジェクト自体のプロパティのみが返されます。IE ではそうではありません: トラッカーにはプロパティがないため、継承チェーンではなくコピーを作成prototype
するように見えますか? true を返しますが、false と評価されます。実際、プロパティは未定義です。Object.create
tracker.__proto__ === initialState
tracker.prototype === initialState
tracker.prototype
質問 1: IE で継承チェーンをセットアップして、変更されていないプロトタイプ値を剥がすことができる別の方法はありますか?
質問 2:ネストされたオブジェクトを可能にする継承チェーンを設定する方法も、可能な場合は希望します。現在、ネストされたオブジェクトは、再帰関数を使用してメインオブジェクトを反復処理することで処理されます。それは私が省略しようとしているものなので、ちょっとばかげています。
要するに:
これがそこにあるかどうか知りたい:
var a = {bar:'1',foo:'bar',atom:'bomb',some:{nested:'objects'}};
var b = Object.magicDeepCreate(a);//<=== preferably X-browser
b.bar = '0';
b.bar.some.nested = 'stuff';
console.log(JSON.stringify(b));
//{"bar":"0","some":{"nested":"stuff"}}
いつものように: jQuery タグがないということは、jQuery がない
ことを意味します 注: IE とは、IE9 ではなく、巨大な IE8 を意味します (悲しいことに、会社のポリシー)