1

有没有办法将“隐藏”的不可枚举属性添加到跨浏览器工作的 JavaScript 对象?

对于大多数现代浏览器,您可以执行以下操作:

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

对于一些没有. Object.defineProperty___proto__

然而,这些都不适用于 IE。有没有办法在 IE8 中实现这一点(如果 IE7 也很酷,但不是必需的)?

主要目标是能够将跟踪器属性添加到任何 JavaScript{}对象,但是当您调用 时JSON.stringify(obj),它不会包含在属性中。我意识到你可以添加自定义 JSON 替换函数(基本上是扩展JSON.stringify功能),但我不是这个的忠实粉丝,因为这意味着任何时候你将这些跟踪的 JavaScript 对象序列化为 JSON,你必须知道/记得添加那个替换功能,这是非常不切实际的。

有没有办法做到这一点?

4

1 回答 1

2

好吧,我无法在 IE10 的 IE8 兼容模式下重现它,但定义一个类似的属性"toLocaleString"应该可以工作,因为IE8 中的 don't enum 错误

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 回答