当前位置 : 主页 > 大数据 > 区块链 >

如何在Array.prototype和Object.prototype上的javascript中定义方法,以便它不会出现在fo

来源:互联网 收集:自由互联 发布时间:2021-06-22
我想在Array.prototype和Object.prototype上定义辅助方法.我目前的计划是做以下事情: Array.prototype.find = function(testFun) { // code to find element in array}; 所以我可以这样做: var arr = [1, 2, 3];var found
我想在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循环中循环数组,方法显示为值:

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

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

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

当然,如果在泛型函数中进行枚举并且不知道他是否获得数组,普通对象或具有自定义原型的对象,则可以像这样使用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-loops – 有些只是因为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
    }
});
网友评论