2014-01-14 60 views
0

我有這個結構的一個雛形:爲什麼JSON.stringify返回「{}」?

function MyObj() { } 

MyObj.prototype = { 
    prop1: { 
     prop11: null, 
     prop12: null, 
     prop13: null, 
    }, 
    prop2: { 
     prop21: null, 
     prop22: null, 
     prop23: null, 
    }, 
    prop3: { 
     prop31: [], 
     prop32: '', 
     prop34: [], 
    }, 
    prop4: { 
     prop41: null, 
    }, 
} 

當我打電話JSON.stringify(myObjInstance),我得到{},爲什麼呢?

+2

類似http://stackoverflow.com/questions/12369543/why-is-json-stringify-not-serializing-prototype-values。您可以編寫自定義['toJSON'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#toJSON_behavior)方法來避免這種情況。 – maxdec

回答

2

因爲JSON.stringify僅包括一個對象的自己特性(具體地,擁有枚舉特性),而不是屬性的對象從它的原型或任何它自己的屬性是不可枚舉的繼承。

因此,例如:Live Copy | Live Source

function Foo() { } 

Foo.prototype.inherited = true; 

var f = new Foo(); 
Object.defineProperty(f, "ownNonEnumerable", { 
    value: true 
}); 

f.ownEnumerable = true; 

console.log(f.inherited);  // true 
console.log(f.ownNonEnumerable); // true 
console.log(f.ownEnumerable); // true 
console.log(JSON.stringify(f)); // {"ownEnumerable": true} 
3

這是因爲通過prop1prop4的原型的屬性,而不是實例化的對象的。

你可以把它比作是這樣的:

for (var i in obj) { 
    if (obj.hasOwnProperty(i)) { 
     // add property to bag 
    } 
} 

只有自身使用對象的屬性。

1

JSON.stringify將只包括財產,如果它能夠與hasOwnProperty被發現,並

new MyObj().hasOwnProperty("prop1") === false; 

試試這個:

JSON.stringify(MyObj.prototype); 
1

JSON.stringify(obj)將輸出的對象本身具有的屬性,不是它的原型。它的原型是一個不同的對象。

你在找什麼會是這樣的

JSON.stringify(MyObj.prototype) 
-1

我有同樣的問題,當我開始使用JSON.stringify工作。爲了創建一個字符串,你創建的對象需要typeof ==對象。否則它將無法工作。

嘗試提醒MyObj的類型。如果它不是對象,將無法正常工作。

MyObj = { 
prop1: { 
    prop11: null, 
    prop12: null, 
    prop13: null, 
}, 
prop2: { 
    prop21: null, 
    prop22: null, 
    prop23: null, 
}, 
prop3: { 
    prop31: [], 
    prop32: '', 
    prop34: [], 
}, 
prop4: { 
    prop41: null, 
}, 

}