有没有办法将“隐藏的”非可枚举属性添加到跨浏览器的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时,你必须知道/记得添加一个非常不切实际的替换函数。
有没有办法实现这个目标?
答案 0 :(得分: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"
,因为这些函数几乎从未被调用过。