JavaScript-JSON对象可以继承父原型属性吗?
有时,我会在JSON字符串对象上运行以下操作:JavaScript-JSON对象可以继承父原型属性吗?,javascript,json,Javascript,Json,有时,我会在JSON字符串对象上运行以下操作: for(var i in JSONObject){ .... } 我需要在这里运行.hasOwnProperty吗?我假设由于JSON不是从父对象扩展而来的,所以可以安全地假设它的所有属性都是自己的 我假设由于JSON不是从父对象扩展而来的,所以可以安全地假设它的所有属性都是自己的 那不太对。除非对象是通过object.create(null)创建的,否则它的原型链中有object.prototype。您提到的属性,如hasOwnProp
for(var i in JSONObject){
....
}
我需要在这里运行.hasOwnProperty
吗?我假设由于JSON不是从父对象扩展而来的,所以可以安全地假设它的所有属性都是自己的
我假设由于JSON不是从父对象扩展而来的,所以可以安全地假设它的所有属性都是自己的
那不太对。除非对象是通过object.create(null)
创建的,否则它的原型链中有object.prototype
。您提到的属性,如hasOwnProperty
,或toString
,都在这里定义。因此,大多数对象不仅仅具有“它们自己的”属性,还包括通过JSON.parse从JSON创建的对象
但是,在对象.prototype
上定义的所有标准属性都是不可枚举的,因此不会出现在for..in
循环中
那么,您应该使用hasOwnProperty
?通常情况下,这要看情况而定
如果您确定您使用的任何代码(无论是您自己的代码还是第三方代码)都不会将可枚举属性添加到对象.prototype
,则没有理由在循环中使用hasOwnProperty
如果您对此不确定,那么您可能希望使用hasOwnProperty
,但最好不要使用可枚举属性扩展Object.prototype
,并避免使用可枚举属性的第三方代码
相关的:
我对此进行了一些测试,JSON字符串不会传输继承的属性。假设您有一个来自端点的API响应,在美化它之后,它看起来像这样:
{
"one": "blue",
"two": "watermellon",
"three": "lalal",
"four": "value"
}
如果在上面解析的值上运行for(JSONObject中的var i)
循环,只要在当前环境中没有显式地将任何属性附加到父对象文本(object.prototype
)上,就只能找到与该对象相关联的四个属性。我在这里没有看到任何JSON。请阅读json
标记的使用说明。具体取决于JSONObject
是什么。注意(除了你肯定不是这个意思)那要视情况而定。你想保护自己免受Object.prototype.foo=42代码>其他代码可能会做什么?如果是,则需要hashOwnProperty
。其他人也说过,这里没有JSON。什么是“JSON字符串对象”@FelixKling如果你想保护自己不受Object.prototype.foo=42
的影响,只需保护你的整个代码库不受这种分配。您永远不需要保护属性枚举。“我假设,由于JSON不是从父对象扩展而来的”JSONObject
不是JSON。包含JSON的字符串是传递给JSON.parse
的内容。它返回一个JavaScript值(在您的例子中可能是一个对象)。(几乎)每个对象都“继承”自object.prototype
。有一种关于JSON.parse
的风格,它将创建一个没有原型的对象,但它不会去任何地方,正如您所说,它通常并不重要。“您只会找到与该对象关联的四个属性”不,这不正确。这取决于使用对象的环境。证据:。正如我在回答中所解释的,for…in
迭代所有可枚举属性。如果您碰巧在Object.prototype
上有一个可枚举属性,它也会被迭代。同样,这种情况发生的可能性不大,但说它永远不会发生是不正确的。“我对此运行了两个测试,JSON字符串不会传输继承的属性。”这一点从未受到质疑。JSON字符串不会传输继承的属性JSON字符串不会传输任何内容。它们只是线。如果您指的是“由JSON.parse创建的JavaScript对象”,请澄清这一点。如果这就是您的意思,您认为哪些继承属性可能会“传输”?只要您没有显式地将任何属性附加到父对象文本(Object.prototype
),它就不是“父对象文本”;这是原型。你的陈述无论如何都是不正确的,除非你说“没有显式地附加任何可枚举属性”。