【问题标题】:Why does JSON.stringify returns "{}"? [duplicate]为什么 JSON.stringify 返回“{}”? [复制]
【发布时间】:2014-02-02 13:30:12
【问题描述】:

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

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

【问题讨论】:

标签: javascript json


【解决方案1】:

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

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

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

仅使用对象本身的属性。

【讨论】:

    【解决方案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】:

      JSON.stringify 将仅包含可以使用hasOwnProperty 找到的属性,并且

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

      试试这个:

      JSON.stringify(MyObj.prototype);
      

      【讨论】:

        【解决方案4】:

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

        你要找的是这样的

        JSON.stringify(MyObj.prototype)
        

        【讨论】:

          【解决方案5】:

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

          尝试提醒 MyObj 的 typeOf。如果不是 Object 就不行。

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

          }

          【讨论】:

            猜你喜欢
            • 2016-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-06-22
            • 2019-11-17
            • 2017-06-13
            • 2019-03-07
            • 2020-06-23
            相关资源
            最近更新 更多