1

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__ === initialStatetracker.prototype === initialStatetracker.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 を意味します (悲しいことに、会社のポリシー)

4

1 に答える 1

2

tracker.__proto__ === initialStatetrueを返しますが、tracker.prototype === initialStatefalseと評価されますが、実際にはtracker.prototypeプロパティは未定義です。

__proto__プロパティは非標準でFFのみです。オブジェクトのプロトタイプオブジェクトを取得するには、を使用しますObject.getPrototypeOf()関数オブジェクトprototypeプロパティは、その関数のすべてのインスタンス(を使用して作成された)が継承するオブジェクトを参照するプロパティです。new

IEではそうではありません

Object.create()IE8ではまったくサポートされていません。一般的なシムを使用しましたか、それとも静かに失敗しましたか?または、実際にすべてのプロパティをコピーする関数を使用しましたか?

Object.magicDeepCreate(a)、できればXブラウザ

すべてのターゲットブラウザが以下を実装していると仮定すると、これは単純なはずですObject.create

Object.deepCreate = function deepCreate(o) {
    var res = Object.create(o);
    for (var i in o)
        if (Object.hasOwnProperty(o, i) && typeof o[i] == "object")
             res[i] = deepCreate(o[i]);
    return res;
};

変更されたものだけを文字列化する

これは、の標準的な動作である必要がありますJSON.stringify-プロトタイプオブジェクトは考慮されません。

trackerただし、そのオブジェクトに継承が必要な理由はわかりません。空のオブジェクトを使用し、変更されたすべてのプロパティを追加するだけです。初期状態にリセットされたものを削除したい場合は、それを追加のオブジェクトに保存して比較することができますが、継承する理由はありません。使用するだけです:

Object.emptyStructure = function s(o){
    var res = {};
    for (var i in o)
        if (typeof o[i] == "object")
            res[i] = s(o[i]);
    return res;
};
var initialState = getInitialState();
var tracker = Object.emptyStructure(initialState);

// set:
if (newVal == initialState.some.nested)
    delete tracker.some.nested;
else
    tracker.some.nested = newVal;
于 2012-07-19T11:34:56.993 に答える