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
属性的元素自动添加的古怪属性。