2012-11-25 37 views
0

我想序列化替換函數內部的非枚舉屬性。無法更改JSON.stringify replacer函數內部的枚舉屬性?

這裏有什麼問題?

請幫忙。

var obj = {x:1,y:2}; 
Object.defineProperty(obj,"x",{enumerable:false}); 


var s = JSON.stringify(obj,function(key,value){ 
if(this.propertyIsEnumerable(key) == false){ 
Object.defineProperty(this,key,{enumerable:true}); 
} 
return value;}); 

//"{"y":2}" 
// x remains not enumerable 

我猜在執行replacecer函數之前會過濾掉非枚舉屬性。不確定。

+0

如果'.stringify'過濾掉不可枚舉屬性,那麼是的,它們在回調中不可用 - 它已經完成了該過濾器。你爲什麼不在字符串化之前循環對象的所有鍵,'for(key in obj)',並且如果內部的邏輯不是已經存在的話,可以使用你的邏輯來設置它爲可枚舉的。然後,只需簡單地調用'JSON.stringify(obj);' – Ian

+0

好,因爲在循環中不包括非枚舉屬性:) –

+0

啊,是的,那麼這將是有道理的!那麼你想在序列化中包含哪些不被設置爲'enumerable'的東西呢? – Ian

回答

1

如果.stringify過濾掉不可枚舉的屬性,那麼是的,它們在回調中不可用 - 它已經完成了該過濾器。爲什麼不在串行化之前遍歷對象的所有鍵,並在內部使用邏輯將其設置爲可枚舉(如果它尚未枚舉)。然後,只需撥打JSON.stringify(obj);。不幸的是,正如您所指出的,for in循環和jQuery的$.each不會遍歷非可枚舉鍵。我發現,.getOwnPropertyNames要做到你想要什麼 - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames

下面是使用它的一個例子,類似你的代碼提供:

http://jsfiddle.net/9Em82/

var obj = {x:1,y:2}; 

Object.defineProperty(obj,"x",{enumerable:false}); 

var all = Object.getOwnPropertyNames(obj); 
for (var i = 0, j = all.length; i < j; i++) { 
    console.log("KEY: " + all[i]); 
}