11

我相信 ECMA 标准的一部分是,当对象类似于数组时,Javascript 控制台会将对象显示为数组。

如:["hello", "world"] 表示包含数字索引的字符串的对象。

类似数组的行为被定义为对象上存在的长度属性和拼接方法,以及数字索引的属性。

我们中的许多人过去可能已经在 jQuery 中看到了这一点。

我一直在尝试利用这种行为并认为它是可取的。但是,我有一个额外的要求,即我的索引使用 getter/setter 来设置它们,以便在修改它们时我可以进行一些额外的处理。

但是,当我这样做时,上面的数组反而呈现为:

[未定义×2]

但是,该对象的其他行为与简单示例完全相同。

请参阅此小提琴以获得更好的解释:http: //jsfiddle.net/5YgAv/

所以你看?两个非常相似的例子,但是 getter 的存在在控制台中破坏了它。

我一直在调试最新的 Chromium 源代码,似乎 Chrome 在控制台上推送了一条消息,该消息基本上包含 getter 函数。但是,无法修改控制台源代码,以便它可以调用函数并获取值。如果有可能,那么我们可以修改开发者工具以正确处理 getter 和 setter。

我想知道的是,是否有人对这个有趣的小错误有任何见解,或者在我将它作为一个错误提交给 Chrome 团队之前如何最好地修复它,以便被长期遗忘并埋在谷歌的深处。我实际上很想自己解决这个问题。

我也愿意接受一种优雅的解决方法,并允许我在我的类数组对象上的任何属性被修改时进行一些特殊处理。

帮助我 Obi-Stackoverflow-Kenobi,你是我唯一的希望!

[瑞安]

4

1 回答 1

2

虽然这不能回答为什么 Chrome 不会像数组一样写出你的数组的问题,但有一种方法可以“欺骗”Chrome 去做。对我们来说幸运的是,它非常简单。

  1. 覆盖对象的 toString 函数,返回数据变量
  2. 记录数组时,将其记录为 myArray.toString();

看到这个jsFiddle:http: //jsfiddle.net/YXwxS/

与此同时,我将继续研究这个,因为这是一个有趣的问题:)

于 2012-07-14T12:16:16.613 回答