在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会有点摸不着头脑~~~