gpt4 book ai didi

javascript - 如何在 Array.prototype 和 Object.prototype 上的 javascript 中定义方法,使其不会出现在 for in 循环中

转载 作者:行者123 更新时间:2023-11-28 06:20:28 25 4
gpt4 key购买 nike

我想在 Array.prototype 和 Object.prototype 上定义辅助方法。我目前的计划是做类似的事情:

Array.prototype.find = function(testFun) {
// code to find element in array
};

这样我就可以做到这一点:

var arr = [1, 2, 3];
var found = arr.find(function(el) { return el > 2; });

它工作正常,但如果我在 for in 循环中循环数组,方法将显示为值:

for (var prop in arr) { console.log(prop); }
// prints out:
// 1
// 2
// 3
// find

这会搞砸任何其他依赖 for in 来显示值的人(尤其是在对象上)。更高版本的 javascript 在数组中内置了 .map 和 .filter 函数,但这些函数不会出现在 for in 循环中。如何创建更多类似不会出现在 for in 循环中的方法?

最佳答案

这很简单:不要使用 for-in loops with Arrays 。责怪其他这样做的人 - here is a nice snippet 在开发过程中告诉他们。

当然,如果一个人在泛型函数中进行枚举,并且不知道他得到的是数组、普通对象还是具有自定义原型(prototype)的对象,则可以像这样使用 hasOwnProperty:

for (var prop in anyObj )
if (Object.prototype.hasOwnProperty.call(anyObj, prop))
// do something

请注意显式使用 Object.prototype 来获取函数 - 可能有对象覆盖它(特别是在数据映射中,该值甚至可能不是函数),do not support it 的对象或根本不继承自 Object.prototype 的对象。另请参阅 here

然而,只有意识到这个问题的脚本作者才会过滤他的所有 for-in 循环 - 有些只是因为 it gets recommended 才这样做 - 而且大部分都是错误的,他应该使用 for 循环数组迭代来代替。但我们的问题是那些不知道这一点的作者。

一个有趣但仅限 Mozilla 的方法是通过 __iterate__ 覆盖数组上的枚举行为,如 demonstrated here

幸运的是,EcmaScript 5.1 允许我们将属性设置为不可枚举。当然,旧版浏览器不支持这一点,但为什么要这么麻烦呢?无论如何,我们需要使用 es5-shims 来处理所有很酷的高阶数组:-)像这样使用 defineProperty :

Object.defineProperty(Array.prototype, "find", {
enumerable: false,
writable: true,
value: function(testFun) {
// code to find element in array
}
});

关于javascript - 如何在 Array.prototype 和 Object.prototype 上的 javascript 中定义方法,使其不会出现在 for in 循环中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35584459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com