2016-12-23 63 views
2

有时候我运行下面的JSON字符串对象:JavaScript - 可以JSON对象继承父级原型属性?

for(var i in JSONObject){ 
    .... 
} 

我需要在这里运行.hasOwnProperty?我假设由于JSON不是从父对象扩展而来的,因此假定它的所有属性都是它自己的属性是安全的。

+5

我在这里没有看到任何JSON。请阅读'json'标签的使用说明。 – trincot

+4

取决于“JSONObject”是什么。注意[在Javascript中没有“JSON对象”](http://benalman.com/news/2010/03/theres-no-such-thing-as-a-json/)([JSON'除外]对象](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON),你当然不是这个意思)。 – Bergi

+1

这取决于。你想保护自己免受'Object.prototype.foo = 42;'一些其他的代码可能会做什么?如果是,那么你需要'hashOwnProperty'。而且其他人也已经说过,这里没有JSON。什么是“JSON字符串对象”? –

回答

-1

我跑了几个测试就这个问题和JSON字符串将不会传送继承属性。所以我们可以说你从看起来像这样的一个端点API响应你美化之后:

{ 
    "one": "blue", 
    "two": "watermellon", 
    "three": "lalal", 
    "four": "value" 
} 

如果您运行for(var i in JSONObject)循环超过上述的分析得到的值,你永远只能找到相关的四个属性只要您没有明确地将任何属性附加到当前环境中的父对象字面量(Object.prototype)上。

+0

*“你只能找到与该物体相关的四个属性”*不,这是不正确的。它取决于使用对象的环境。证明:https://jsfiddle.net/scde1pfL/。正如我在我的回答中解释的那样,“for ... in”遍历所有可枚举的属性。如果你碰巧在'Object.prototype'上有一个枚举属性,它也会被迭代。再次发生这种情况的可能性不大,但说它永远不会发生是不正确的。 *“我对此进行了一些测试,JSON字符串不会传输继承的属性。”*这从来没有被质疑过。 –

+0

* JSON字符串不会传输继承的属性* JSON字符串不传输任何东西。他们只是字符串。如果你的意思是“由JSON.parse创建的JavaScript对象”,那么请澄清一下。如果这就是你的意思,你认为他们可能会“传递”什么遗传属性? –

+0

*只要你没有显式附加任何属性到父对象文字('Object.prototype')*它不是“父对象文字”;它是原型。而且你的声明不正确,除非你说“没有明确附加任何* enumerable *属性”。 –

3

我假设由于JSON不是从父对象扩展的,所以假设它的所有属性都是自己的属性是安全的。

这并不完全正确。除非通过Object.create(null)创建对象,否则它的原型链中有Object.prototype。诸如hasOwnProperty,您提到的属性或toString等属性在此处定义。因此,大多数对象不仅仅具有“他们自己的”属性,还包括通过JSON.parse从JSON创建的对象。
但是,在Object.prototype上定义的所有标准属性均为而不是可枚举的,因此不会出现在for..in循环中。

那么,你应该使用hasOwnProperty?像往常一样:这取决于。

如果你确信没有您使用的代码,无论是你自己或第三方代码,添加枚举属性Object.prototype,那么没有理由在循环使用hasOwnProperty

如果您不确定,那么您可能需要使用hasOwnProperty,但最好不要将Object.prototype扩展为可枚举的属性,并避免使用第三方代码。


相关:

+1

有关于ES讨论的简短讨论(https://esdiscuss.org/topic/add-an-option-to-omit-prototype-of-objects-created-by-json-parse) 'JSON.parse'可以创建一个没有原型的对象,但它没有去任何地方,正如你所说的那样,它通常无关紧要。 –