2013-05-16 63 views
1

我试图从对象a创建一个新对象b使用Object.create的Object.create,当JSON.stringify对象

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/

+1

什么是stringify打印? – Thilo

+0

@Thilo请检查jsfiddle链接 – rab

+0

jsfiddle在这里被阻止。包括完整的问题可以让每个人都更容易。 – Thilo

回答

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. 我改变了第二的指数环

如果你看一下Object.create的确,你传入的第一个参数是新ob的原型JECT。这意味着b在原型链中拥有一切。 hasOwnProperty修复了这个问题,因为它只在被测试的属性位于对象本身而不是原型链中的某处时才返回true。

现在它表现得如我所想。

0

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

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

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

现在b.a.n设置为1JSON.stringify包括它在输出中。

4

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

+1

另请参阅http://stackoverflow.com/a/12369651/406343 – Alexander

+1

具体来说:'JSON.stringify'只包含* enumerable *,* own *属性,而不是从原型继承的属性,而不是不可枚举的属性。 –

+0

@Ankur你的回答有助于解决我的问题。什么是解决方案打印正确的'JSON.stringify'? – rab

相关问题