在Array原型链上扩展remove,contain等方法所遇到的坑

相信jser兄弟们肯定会碰到这样一个问题,

在做数组类的操作的时候,会要求删除数组中的一个元素;亦或是判断某值是否存在于这个数组;

OK,拿删除数组元素举例,扩展方法为:

Array.prototype.remove = function(val){
    var index = this.indexOf(val);
    if (index > -1) {
        this.splice(index, 1);
    }
}

很简单了扩展了一个删除元素的方法,那么我说的坑是什么呢?

在我们使用for··in 遍历对象的时候是把对象的可枚举属性都遍历了,!!!包括其原型链上的东东(坑!),下面看图说话:

一张图说明一切了对么?你以后每次使用for···in···进行遍历的时候都会保函在这里所扩展的remove方法,那么解决方案呢?

判断是否是它私有属性,如果不是就说明不是自己“亲生的”,直接break扔掉;

------------------------------------------------------------------------------------------

以上情况经常出现在字符串模板里面,就是给String扩展一个format方法,如下

String.prototype.format = function(args) {
            var result = this;
            if (arguments.length < 1) {
                return result;
            }

            var data = arguments; // 如果模板参数是数组
            if (arguments.length == 1 && typeof (args) == "object") {
                // 如果模板参数是对象
                data = args;
            }
            for ( var key in data) {
                if(!data.hasOwnProperty(key))break;
                var value = data[key];
                if (undefined != value) {
                    result = result.replaceAll("\{" + key + "\}", value);
                }
            }
            return result;
        }

如果没有做处理的话,偶尔碰到莫名其妙的undefined会有点摸不着头脑~~~

原文地址:https://www.cnblogs.com/AlexBlogs/p/6141220.html