javascript - 序列化坐标 : Object. keys() 在 native 接口(interface)实例上失败?

标签 javascript google-chrome

我使用 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/

相关文章:

javascript - 在 Chrome 中禁用 HTML<audio> 播放器中的下载按钮

javascript - 自定义替换方法?

javascript - 使用 init 时 Ember 文本字段事件不起作用

javascript - 如何在 Javascript 中向 btn.innerHTML 添加函数?

javascript - 找不到模块 : Can't resolve 'readline'

jquery - Ajax .load() 后加载的内容会丢失字符集(UTF-8),但仅限于 FireFox 和 IE。 Chrome 和 Opera 运行良好

javascript - 如何从父组件中的子元素获取累积高度

google-chrome - CSS 虚线边框在 Chrome 中呈现为虚线

javascript - pageAction 上的 chrome 'setBadgeText'

javascript - vendor 前缀为 'requestAnimationFrame' 的实现之间有什么区别?