我有一些使用地理位置API在Chrome中运行的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, 海拔: 空, 精度: 150, 海拔精度: 空, ...}
但是,我调用console.log(Object.keys(pos.coords))
的下一行,我得到一个空数组:
[]
同样,如果我尝试使用JSON.stringify(pos.coords)
,我只会得到一个空对象{}
。
有没有合理的方法来循环pos.coords
的键? 我必须制作自己的密钥列表才能循环访问吗?
Object.keys(pos.coords)
得到一个空数组
是的,Coordinates
接口的属性在原型对象上实现为 getter(而不是自己的属性(,因此Object.keys
找不到它们。
有没有合理的方法来循环 pos.coords 的键?
实际上,您可以循环访问它们:
for (const p in pos.coords)
console.log(p);
另一种方法是使用
Object.getOwnPropertyNames(Object.getPrototypeOf(pos.coords));
你猜他们为什么
这样做吗?
我怀疑他们是访问从主机对象链接的内部本机数据表示的 getter。这样,它们就按照接口规范的要求隐式只读。不过,他们应该能够通过简单地让他们拥有不可写的数据属性来实现这一点。