如何在JavaScript中为IE8添加非可枚举属性?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在JavaScript中为IE8添加非可枚举属性?相关的知识,希望对你有一定的参考价值。

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

对于大多数现代浏览器,您可以:

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

对于没有Object.defineProperty的一些较旧的非IE浏览器,您可以使用the __proto__ hack

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

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

有没有办法实现这个目标?

答案

好吧,我无法在IE10的IE8兼容模式下重现它,但定义像"toLocaleString"这样的属性应该可以工作,因为the don't enum bug in IE8

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""propertyIsEnumerable",因为这些函数几乎从未被调用过。

以上是关于如何在JavaScript中为IE8添加非可枚举属性?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中为枚举值添加描述以与 ASP.NET MVC 中的下拉列表一起使用? [复制]

如何在javascript中为函数添加回调

在 Android 中为 Spinner 的数组适配器添加枚举

如何在javascript中为innerhtml添加CSS

尝试使用javascript添加样式标签(IE8中的innerHTML)

如何在javascript中为每个频谱栏添加类?