1

我试图使用b从对象创建一个新对象aObject.create

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/的链接

4

3 回答 3

4

这是因为n它是原型属性,b并且JSON.stringify仅适用hasOwnProperty于在对象上返回 true 的那些属性。

于 2013-05-16T11:57:13.753 回答
1

我更新了你的小提琴

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。

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

于 2013-05-16T11:57:23.153 回答
0

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

var a = {};
var b = {a:a};

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

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

于 2013-05-16T11:57:10.473 回答