我使用 Geolocation 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)
:
Coordinates {latitude: 5.520007, longitude: 13.404954, altitude: null, accuracy: 150, altitudeAccuracy: null, …}
但是,在我调用 console.log(Object.keys(pos.coords))
的下一行,我得到一个空数组:
[]
同样,如果我尝试使用 JSON.stringify(pos.coords)
,我只会得到一个空对象 {}
。
有没有合理的方法来循环遍历 pos.coords 的键?我必须自己创建要循环的键列表吗?
最佳答案
Object.keys(pos.coords)
gets an empty array
是的,Coordinates
的属性接口(interface)被实现为原型(prototype)对象上的 getter(而不是自己的属性),因此 Object.keys
找不到它们。
Is there any reasonable way to loop through the keys of pos.coords?
事实上,您可以循环遍历它们:
for (const p in pos.coords)
console.log(p);
另一种方法是使用
Object.getOwnPropertyNames(Object.getPrototypeOf(pos.coords));
Do you have a guess as to why they did it this way?
我怀疑它们是访问从主机对象链接的内部 native 数据表示的 setter/getter 。这样,它们就隐式只读为 the spec for the interface需要。不过,他们应该能够通过简单地使自己成为自己的不可写数据属性来实现这一目标。
关于javascript - 序列化坐标 : Object. keys() 在 native 接口(interface)实例上失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45827099/