Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在IE8的JavaScript中添加不可枚举属性?_Javascript_Internet Explorer 8_Cross Browser_Enumerable - Fatal编程技术网

如何在IE8的JavaScript中添加不可枚举属性?

如何在IE8的JavaScript中添加不可枚举属性?,javascript,internet-explorer-8,cross-browser,enumerable,Javascript,Internet Explorer 8,Cross Browser,Enumerable,有没有办法向跨浏览器工作的JavaScript对象添加“隐藏的”不可枚举属性 对于大多数现代浏览器,您可以执行以下操作: Object.defineProperty(obj, '__id__', { enumerable: false, value: id++ }); 对于一些没有Object.defineProperty的旧版非IE浏览器,您可以使用 然而,这些都不适用于IE。在IE8中有没有实现这一点的方法(如果IE7也可以,那会很酷,但不是必需的) 主要目标是能够向任何JavaScrip

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

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

Object.defineProperty(obj, '__id__', { enumerable: false, value: id++ });
对于一些没有
Object.defineProperty
的旧版非IE浏览器,您可以使用

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

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


有什么方法可以做到这一点吗?

我不能在IE10的IE8兼容模式下复制它,但是 定义像
“ToLocalString”
这样的属性应该可以工作,因为


您也可以使用
“isPrototypeOf”
“propertyIsEnumerable”
,因为这些也是几乎从未调用过的函数。

您说的是IE8+,但
Object.defineProperty()
在IE9中不起作用?哦,是的,我想我只是指IE8。如果有一种方法也支持IE7,那就太棒了,但基本上就是如何在IE8中实现它。更新的问题。@LancePollard我想有个bug。。只是不要用这个代码好吧哈哈
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++ });
        }

    }

})();