在下面的代码中,我得到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>
答案 0 :(得分:2)
正如@Bergi在他的评论中所说,window
对象被称为WindowProxy的东西包装。就像他说的那样:充满异国情调,类似代理人(古怪而神奇:-)。规格中的更多细节:
WindowProxy是一个外来对象,它包装Window普通对象,从而将大多数操作间接传递给包装的对象。每个浏览上下文都有一个关联的WindowProxy对象。浏览上下文时,由浏览上下文的关联WindowProxy对象包装的Window对象将发生更改。
WindowProxy奇异对象必须使用普通的内部方法,除非在下面另有明确指定的地方。
关于使用普通内部方法的最后一部分(除非...明确指定)是关键。
在EcmaScript 262 standard中,它指定hasOwnProperty
使用GetOwnProperty
。 getOwnPropertyNames
使用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"