2013-07-29 37 views
1

有没有办法来“隐藏”不可枚举的属性添加到JavaScript对象,工程跨浏览器?如何在JavaScript中为IE8添加非可枚举属性?

对于大部分现代浏览器,你可以这样做:

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,你必须知道/记得添加替代功能是非常不切实际的。

有没有办法做到这一点?

+0

你说IE8 +,但不'Object.defineProperty()'在IE9工作? – nnnnnn

+0

噢,我想我只是意味着IE8。如果有支持IE7的方式也将是真棒,但基本上只是如何做到这一点的IE8。更新的问题。 –

回答

2

嗯,我无法重现它在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",因为这些也是被几乎从不调用的函数。

+0

啊美丽!这是完美的,谢谢:) –

+0

@LancePollard我觉得有一个错误..只是不使用此代码确定lol – Esailija

+0

哈哈听起来不错 –