获取所有属性名称

时间:2020-01-16 22:22:02

标签: javascript google-chrome

在下面的代码中,我得到true的含义,即属性someMagic至少在Chrome和Firefox中是obj的财产。

但是当我尝试通过getOwnPropertyNames获取完整的属性列表时,返回的数组在两个浏览器中都不包含它。在chrome中,我收到单个属性constructor;在FF中,结果是一个空数组。为什么?

是否可以获取所有名称?

var obj = Object.getPrototypeOf(Object.getPrototypeOf(window))
console.log(obj.hasOwnProperty('someMagic'))
console.log(Object.getOwnPropertyNames(obj))
<div id="someMagic"></div>

2 个答案:

答案 0 :(得分:2)

正如@Bergi在他的评论中所说,window对象被称为WindowProxy的东西包装。就像他说的那样:充满异国情调,类似代理人(古怪而神奇:-)。规格中的更多细节:

WindowProxy是一个外来对象,它包装Window普通对象,从而将大多数操作间接传递给包装的对象。每个浏览上下文都有一个关联的WindowProxy对象。浏览上下文时,由浏览上下文的关联WindowProxy对象包装的Window对象将发生更改。

WindowProxy奇异对象必须使用普通的内部方法,除非在下面另有明确指定的地方。

关于使用普通内部方法的最后一部分(除非...明确指定)是关键。

EcmaScript 262 standard中,它指定hasOwnProperty使用GetOwnPropertygetOwnPropertyNames使用OwnPropertyKeys。请注意,这两个都在WindowProxy中被覆盖:

7.4.5 [[GetOwnProperty]](P)

7.4.10 [[OwnPropertyKeys]]()

因此,您在上面使用的两个属性都使用了覆盖的非常规方法,而不是“常规内部方法”。因此,他们给出了不寻常的结果。 7.4.5 GetOwnProperty下甚至还有一个警告,警告“规格”“故意违反”:

这故意违反了JavaScript规范的基本内部方法的不变性,以保持与现有Web内容的兼容性。有关更多信息,请参见tc39 / ecma262问题#672。 [JAVASCRIPT]

StackOverflow Answer提供了有关这种奇怪行为如何成为HTML5标准一部分的历史。

答案 1 :(得分:0)

您可以使用for in来完成

示例:

const obj =  {
  property: 'test',
  property2: 'test2'
}

for(property in obj)
  console.log('PROPERTY', property)

结果控制台

const obj =  {
  property: 'test',
  property2: 'test2'
}

for(property in obj)
  console.log(property)

> "property"
> "property2"