Javascript 获取所有属性名

Javascript 获取所有属性名,javascript,google-chrome,Javascript,Google Chrome,在下面的代码中,我得到了true意思属性someMagic是obj的自有属性,至少在Chrome和Firefox中是如此 但当我试图通过getOwnPropertyNames获取完整的属性列表时,返回的数组在两种浏览器中都不包含它。在chrome中,我接收单个属性构造函数,在FF中,结果是一个空数组。为什么? 是否可以获取所有名称? var obj=Object.getPrototypeOf(Object.getPrototypeOf(窗口)) log(obj.hasOwnProperty('

在下面的代码中,我得到了
true
意思属性
someMagic
obj
的自有属性,至少在Chrome和Firefox中是如此

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

是否可以获取所有名称?

var obj=Object.getPrototypeOf(Object.getPrototypeOf(窗口))
log(obj.hasOwnProperty('someMagic'))
console.log(Object.getOwnPropertyNames(obj))

正如@Bergi在他的评论中所说,
窗口
对象被一个名为。正如他所说:异国情调,代理式(和古怪和神奇:-)。规范中的更多细节:

WindowProxy是一个奇特的对象,它包装了一个窗口普通对象,将大多数操作间接指向包装的对象。每个浏览上下文都有一个关联的WindowProxy对象。导航浏览上下文时,由浏览上下文的关联WindowProxy对象包装的窗口对象将被更改

WindowProxy外来对象必须使用普通的内部方法,除非下面另有明确指定

关于使用普通内部方法的最后一部分“除非明确指定”是关键

在中,它指定
hasOwnProperty
使用
GetOwnProperty
。而
getOwnPropertyNames
使用
OwnPropertyKeys
。请注意,
WindowProxy
中会覆盖这两个选项:

7.4.5[[GetOwnProperty]](p)

7.4.10[[OwnPropertyKeys]]()

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

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


这提供了更多关于这种奇怪行为如何成为HTML5标准一部分的历史。

您可以使用
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"

你试过
Object.keys(obj)
?@kkesley,两者都是空数组。@kkesley这些将比
getOwnPropertyNames
小,我想这是因为
窗口
对象是(或继承自)一个非常古怪的代理类外来对象。这真的很神奇。我最初也这么想,但实际上,
for…in
在他的特定用例中也不起作用。他特别询问了
窗口
对象,以及为具有
名称
id
属性的元素自动添加的古怪属性。