1

クロスブラウザで動作するJavaScriptオブジェクトに「隠された」列挙不可能なプロパティを追加する方法はありますか?

最近のほとんどのブラウザーでは、次のことができます。

Object.defineProperty(obj, '__id__', { enumerable: false, value: id++ });

を持たない一部の古い非 IE ブラウザではハックObject.definePropertyを使用できます。__proto__

ただし、これらはいずれも IE では機能しません。IE8 でこれを達成する方法はありますか (IE7 もあればクールですが、必須ではありません)。

主な目標は、トラッカー プロパティを任意の JavaScript{}オブジェクトに追加できるようにすることですが、 を呼び出したときにJSON.stringify(obj)プロパティに含まれないようにすることです。カスタムの JSON 置換関数を追加できる (基本的にはJSON.stringify機能を拡張する) ことができることはわかっていますが、追跡された JavaScript オブジェクトを JSON にシリアル化するたびに、それを追加することを知っている/覚えておく必要があるため、私はそれが好きではありません。かなり非現実的な置換機能。

これを達成する方法はありますか?

4

1 に答える 1

2

IE10 の IE8 互換モードで再現することはできませんが、IE8の do not enum バグの"toLocaleString"ため、次のようなプロパティを定義するとうまくいくはずです。

var uniqueId = function() {
    var dontEnumBug = false;
    var id = 0;

    if( !Object.defineProperty ) {
        var keyVisited = false;
        for( var k in {toLocaleString: 3}) {
            if( k === "toLocaleString" ) {
                keyVisited = true; 
            }
        }
        if( !keyVisited ) {
            dontEnumBug = true;
        }
    }

    return function( obj ) {
        if( dontEnumBug ) {
            obj.toLocaleString = id++;
        }
        else {
            Object.defineProperty(obj, '__id__', { enumerable: false, value: id++ });
        }

    }

})();

"isPrototypeOf"orを使用することもできます"propertyIsEnumerable"。これらはほとんど呼び出されない関数でもあります。

于 2013-07-29T22:13:14.637 に答える