【问题标题】:Object.create, not correct when JSON.stringify the objectObject.create,JSON.stringify 对象时不正确
【发布时间】:2013-05-16 11:51:46
【问题描述】:

我尝试使用 Object.create 从对象 a 创建一个新对象 b

var a ={}; 
var b = Object.create( a );

a.n = 1;
b.m = 2;

当我通过 for .. in .. 迭代两个对象时,它显示了正确的值。但 JSON.stringify 没有打印正确的字符串。

JSON.stringify( b )

它应该像 {"n":1,"m":2} 一样打印。但它只打印{"m":2}。有什么建议吗?

我已将其添加到 jsfiddle 中。 jsfiddle的链接http://jsfiddle.net/V3Nxs/

【问题讨论】:

  • stringify 打印什么?
  • @Thilo 请检查 jsfiddle 链接
  • jsfiddle 在这里被阻止。包括完整的问题让每个人都更容易。
  • @rab:不,将相关信息放在问题中。或者你不想让人们更容易地帮助你吗?
  • 问题出在哪里?那 b.n=1?

标签: javascript


【解决方案1】:

这是因为nb 的原型属性,而JSON.stringify 仅适用于对象上的hasOwnProperty 返回true 的那些属性。

【讨论】:

  • 具体:JSON.stringify只包括enumerableown属性,不包括继承自原型的属性,不包括不可枚举的属性。跨度>
  • @Ankur 您的回答有助于解决我的问题。打印正确JSON.stringify 的解决方案是什么?
【解决方案2】:

我更新了你的小提琴

http://jsfiddle.net/V3Nxs/2/

for( var k in b ){
    if (!b.hasOwnProperty(k)) continue;
    html.push( 'b.'+ k +':' + b[k] );
}
  1. 你需要使用 hasOwnProperty
  2. 我更改了第二个 for 循环的索引

如果你看看 Object.create 做了什么,你传入的第一个参数是新对象的原型。这意味着在原型链中 b 拥有 a 所拥有的一切。 hasOwnProperty 解决了这个问题,因为它仅在测试的属性位于对象本身而不是原型链中的某个位置时才返回 true。

现在它的行为符合我的预期。

【讨论】:

    【解决方案3】:

    b.n 未定义是预期行为。为了得到你想要的,你可能想试试这个。

    var a = {};
    var b = {a:a};
    
    a.n = 1;
    b.m = 2;
    

    现在b.a.n 设置为1 并且JSON.stringify 将其包含在输出中。

    【讨论】:

      猜你喜欢
      • 2012-02-17
      • 2016-05-06
      • 2020-03-20
      • 2021-12-28
      • 1970-01-01
      • 2015-03-31
      • 2013-08-07
      • 1970-01-01
      相关资源
      最近更新 更多