2014-01-14 128 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, 
}, 

}