【问题标题】:Why iteration over array shows my custom prototype functions as items?为什么迭代数组将我的自定义原型函数显示为项目?
【发布时间】:2015-12-22 18:20:37
【问题描述】:

为什么要创建自定义 prototype 函数,例如:

Array.prototype.clone = function(){
    return JSON.parse(JSON.stringify(this));
}

在迭代 for 循环时是否使它们可见?

例如:

很明显,我有一个 array,里面有 7 个 arrays,但由于某种原因,它正在考虑我在循环内的所有自定义函数。为什么?如何预防?

OBS:我正在申请某种 javascript 竞赛,该竞赛采用我的算法并与其他玩家比赛。此循环位于运行器内部,因此请考虑更改处理迭代的方式不是一种选择。

这破坏了跑步者,因为它试图执行一些代码,其中的列认为我的自定义函数包含在其中。

但是,查看他们的代码,我注意到可以防止这种情况发生,因为他们还编辑/创建 Array.prototype 函数。

【问题讨论】:

  • 考虑使用jsfiddle.net 提供重现问题所需的最少代码。
  • @LJᛃ 我理解相似之处,但我不认为这是重复的,因为我不想更改循环(正如我在问题上所说,我不能)。我想要的是即使在这种情况下也能隐藏我的自定义函数。
  • @PatrickBard 好好检查那里的第二个答案,它与您得到的答案的第二部分相同:使您的方法不可枚举。
  • 阅读object.prototype 方法。我可以告诉你是哪一个,但你必须给我奖品。

标签: javascript arrays matrix


【解决方案1】:

不要使用for...in 循环遍历数组。 for...in 循环枚举对象的所有属性,并且由于您的新原型函数是可枚举的,因此它也会被列出。避免这种情况的方法是使用array.hasOwnProperty,但是当您可以使用常规for 循环正确地遍历数组时,为什么要这样做呢?它会更快并且使用更少的代码:

for (var i = 0; i < this.matrix.length; i++) {
    ...
}

要让你的新函数在枚举对象的属性时不出现,你需要让它不可枚举:

Object.defineProperty(Array.prototype, 'clone', {
    enumerable: false,
    value: function(obj) {
        return JSON.parse(JSON.stringify(obj));
    }
});

【讨论】:

  • 我明白了,但正如我所说,我无法控制他们使用的代码。在 他们的 runner 内部有一个 for...in 循环,我的代码正在破坏它。
  • @PatrickBard:那么要么不要修改原型,要么将你的函数标记为不可枚举。我会选择前者。
猜你喜欢
  • 2023-02-01
  • 2015-06-06
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 2019-07-08
  • 1970-01-01
  • 2018-08-25
  • 2017-05-31
相关资源
最近更新 更多