2012-05-23 20 views
6

Tại sao JSON.stringify() hiển thị prop2?Tại sao JSON.stringify không hiển thị các thuộc tính đối tượng là các hàm?

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: Chức năng là các đối tượng: thử chạy '(function() {}) instanceof Object' – Eric

Trả lời

16

JSON không thể lưu trữ các chức năng. Theo spec, một giá trị phải là một trong:

Valid JSON values http://json.org/value.gif


Là một mặt lưu ý, mã này sẽ làm cho các chức năng chú ý của JSON.stringify:

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

Vì vậy, trong trường hợp này, JSON có thể không lưu trữ 'undefined'? –

+1

@Derek: Đúng. Tôi nghĩ rằng 'JSON.stringify' chuyển đổi nó thành' null' – Eric

+3

@Derek: 'JSON.stringify' bỏ qua các thành viên có các giá trị' undefined'. Một biến được đặt thành 'undefined' không thể phân biệt được với một biến không bao giờ được đặt. – apsillers

2

Nó không được phép stringify phương pháp (hoặc bất kỳ chức năng) - đặc biệt là kể từ khi hầu hết các phương pháp xây dựng trong các đối tượng (và do đó các nguyên mẫu của bất kỳ đối tượng người dùng xác định) là mã nguồn gốc.

Nếu bạn thực sự cần cần in phương pháp của mình, bạn có thể ghi đè phương thức .toString của đối tượng, nhưng khi bạn gọi JSON.parse trên đầu ra được xâu chuỗi, nó sẽ coi phương thức như thể nó chỉ là một chuỗi , và để có thể gọi nó là một hàm bạn cần phải eval nó - một thực tế thường không được khuyến nghị.

3

Dưới đây là một cách khác bằng cách sử dụng biểu tượng .prototype. Bạn có thể thêm một chức năng để stringify

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