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

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

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

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

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

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

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

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

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

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

判断是否是它私有属性,如果不是就说明不是自己“亲生的”,直接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会有点摸不着头脑~~~

上一篇:解释清楚c++的重载操作符【用自己的话,解释清楚】


下一篇:服务器使用recast navigation