【问题标题】:Serializing Coordinates: Object.keys() fails on instances of native interfaces?序列化坐标:Object.keys() 在本机接口实例上失败?
【发布时间】: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。它们一定在某个地方……(好吧,它是一个可以像代理一样工作的主机对象,但我看不出有任何原因)

标签: javascript google-chrome


【解决方案1】:

Object.keys(pos.coords) 得到一个空数组

是的,Coordinates 接口的属性被实现为原型对象上的 getter(而不是自己的属性),所以Object.keys 找不到它们。

有没有合理的方式循环遍历pos.coords的keys?

实际上,您可以循环遍历它们:

for (const p in pos.coords)
    console.log(p);

另一种方法是使用

Object.getOwnPropertyNames(Object.getPrototypeOf(pos.coords));

你猜他们为什么这样做?

我怀疑它们是访问从主机对象链接的内部本机数据表示的吸气剂。这样,它们就像the spec for the interface 所要求的那样是隐式只读的。不过,它们应该能够通过简单地使它们拥有自己的、不可写的数据属性来实现这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 2016-02-04
    • 1970-01-01
    相关资源
    最近更新 更多