Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript-JSON对象可以继承父原型属性吗?_Javascript_Json - Fatal编程技术网

JavaScript-JSON对象可以继承父原型属性吗?

JavaScript-JSON对象可以继承父原型属性吗?,javascript,json,Javascript,Json,有时,我会在JSON字符串对象上运行以下操作: for(var i in JSONObject){ .... } 我需要在这里运行.hasOwnProperty吗?我假设由于JSON不是从父对象扩展而来的,所以可以安全地假设它的所有属性都是自己的 我假设由于JSON不是从父对象扩展而来的,所以可以安全地假设它的所有属性都是自己的 那不太对。除非对象是通过object.create(null)创建的,否则它的原型链中有object.prototype。您提到的属性,如hasOwnProp

有时,我会在JSON字符串对象上运行以下操作:

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
),它就不是“父对象文本”;这是原型。你的陈述无论如何都是不正确的,除非你说“没有显式地附加任何可枚举属性”。