为什么JSON.stringify返回“{}”?

时间:2014-01-14 13:09:58

标签: javascript json

我有一个这种结构的原型:

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)时,我得到{},为什么?

5 个答案:

答案 0 :(得分:3)

这是因为prop1prop4是原型的属性,而不是实例化对象的属性。

您可以将其与以下内容进行比较:

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

仅使用对象本身的属性。

答案 1 :(得分: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}

答案 2 :(得分:1)

JSON.stringify只有hasOwnProperty才能找到属性,并且

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

请改为尝试:

JSON.stringify(MyObj.prototype);

答案 3 :(得分:1)

JSON.stringify(obj)将输出对象本身所具有的属性,而不是其原型。它的原型是另一个对象。

你正在寻找的东西是这样的

JSON.stringify(MyObj.prototype)

答案 4 :(得分:-1)

当我开始使用JSON.stringify时,我遇到了同样的问题。为了创建一个字符串,您创建的对象需要typeof == object。否则它将无法工作。

尝试提醒MyObj的typeOf。如果它不是不起作用的对象。

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

}