2012-05-23 3 views
6

JSON.stringify()가 prop2를 표시하지 않는 이유는 무엇입니까?JSON.stringify가 함수 인 객체 속성을 표시하지 않는 이유는 무엇입니까?

var newObj = { 
    prop1: true, 
    prop2: function(){ 
    return "hello"; 
    }, 
    prop3: false 
}; 

alert(JSON.stringify(newObj)); // prop2 appears to be missing 

alert(newObj.prop2()); // prop2 returns "hello" 

for (var member in newObj) { 
    alert(member + "=" + newObj[member]); // shows prop1, prop2, prop3 
} 

JSFIDDLE : 기능을 저장할 수 없습니다 http://jsfiddle.net/egret230/efGgT/

+1

@BrandtSolovij 캐릭터 라인 화에 추가 할 수 있습니다 기능은 객체 : 실행 해'(함수() {}) 따라서이 경우 Object' – Eric

답변

16

JSON 때문입니다.

Valid JSON values http://json.org/value.gif 보조 노트로


, 것이 코드는 기능이 JSON.stringify에 의해 발견 :

Function.prototype.toJSON = function() { return "Unstorable function" } 
+0

instanceof를, JSON은'undefined'를 저장할 수 없습니다? –

+1

@Derek : 수정. 나는'JSON.stringify'가'null '로 변환한다고 생각한다. – Eric

+3

@Derek :'JSON.stringify'는'undefined '값을 갖는 멤버를 생략한다. 'undefined'로 설정된 변수는 전혀 설정되지 않은 변수와 구별 할 수 없습니다. – apsillers

2

그것은에 가정 아니에요 사양에 따르면, 값 중 하나 여야합니다 stringify 메소드 (또는 모든 함수) - 특히 내장 객체의 대부분의 메소드 (따라서 사용자 정의 객체의 프로토 타입)가 원시 코드이기 때문에 특히 그렇습니다.

실제로에 메서드를 인쇄해야 할 경우 개체의 .toString 메서드를 재정의 할 수 있지만 문자열화된 출력에서 ​​JSON.parse를 호출하면 메서드가 단지 문자열 인 것처럼 처리됩니다. , 함수로 호출 할 수 있으려면 eval이어야합니다. 일반적으로 권장하지 않는 방법입니다.

3

여기에 .prototype을 사용하는 또 다른 방법이 있습니다. 당신은 기능이

JSON.stringify(obj, function(k, v) { 
    if (typeof v === 'function') { 
    return v + ''; 
    } 
    return v; 
});