【发布时间】:2017-08-23 05:47:54
【问题描述】:
我在 Chrome 中使用 Geolocation API 运行了一些 JavaScript:
navigator.geolocation.watchPosition((pos) => {
console.log(pos.coords);
console.log(Object.keys(pos.coords);
}, (err) => {
alert('Geolocation error.\n' + err.message);
}, {
enableHighAccuracy: true
});
当 Chrome 检测到位置发生变化时,它会触发第一个回调。这很好用。
当我尝试对这些数据做某事时,问题就出现了。当回调被触发时,在我的控制台上,我首先能够看到我调用console.log(pos.coords) 的坐标对象:
坐标{纬度:5.520007,经度:13.404954,高度:null,精度:150,altitudeAccuracy:null,...}
但是,在我调用console.log(Object.keys(pos.coords)) 的下一行,我得到一个空数组:
[]
同样,如果我尝试使用JSON.stringify(pos.coords),我只会得到一个空对象{}。
有什么合理的方法可以循环遍历pos.coords 的键吗?我必须自己列出要循环的键吗?
【问题讨论】:
-
试试
Object.getOwnPropertyNames(如果它们由于某种原因不可枚举)?或者遍历原型链找到 getter。 -
@Bergi
Object.getOwnPropertyNames(pos.coords)也作为空数组出现。 -
似乎有一个 NPM 包可以解决这个问题! github.com/zeke/geoposition-to-object 带有硬编码的属性列表:github.com/zeke/geoposition-to-object/blob/master/index.js Strange。
-
可能是原型上定义的“getter”函数。
Object.getOwnPropertyNames(pos.coords.__proto__);如果是这样,您可以像这样遍历它们:Object.getOwnPropertyNames(pos.coords.__proto__) .forEach(p => console.log(pos.coords[p])) -
@Brad 那么请尝试this。它们一定在某个地方……(好吧,它是一个可以像代理一样工作的主机对象,但我看不出有任何原因)