Javascript:在循环中隐藏原型方法?

所以可以说我已经添加了一些原型方法到Array类:

Array.prototype.containsKey = function(obj) { for(var key in this) if (key == obj) return true; return false; } Array.prototype.containsValue = function(obj) { for(var key in this) if (this[key] == obj) return true; return false; } 

然后我创build一个关联数组并尝试循环它的关键字:

 var arr = new Array(); arr['One'] = 1; arr['Two'] = 2; arr['Three'] = 3; for(var key in arr) alert(key); 

这返回五个项目:

   -一
   -二
   -三
   -containsKey
   -containsValue

但我只想要(只有三个)。 我接近这个错误? 有没有办法“隐藏”原型方法? 或者我应该做一些不同的事情?

您可以使用JavaScript的hasOwnProperty方法在循环中实现这一点,如下所示:

 for(var key in arr) { if (arr.hasOwnProperty(key)) { ... } } 

参考: 这个YUI博客文章 。

您可以通过使原型方法不可枚举来实现期望的结果:

 Object.defineProperty(Array.prototype, "containsKey", { enumerable: false, value: function(obj) { for(var key in this) if (key == obj) return true; return false; } }); 

如果你有方法定义的控制权,这通常会更好,尤其是如果你不能控制你的代码是如何被其他人调用的,这在图书馆代码开发中是一个常见的假设。

Javascript不支持关联数组,就像你认为的那样。 http://ajaxian.com/archives/javascript-associative-arrays-considered-harmful

for(var i in ..获取一个对象的所有属性(一个数组只是另一个对象),这就是为什么你看到你已经原型的其他对象。

正如文章build议你应该使用一个对象:

 var assoc = {'One' : 1, 'Two' : 2}; assoc['Three'] = 3; for(var key in assoc) alert(key+' => '+assoc[key]); 

你可以这样做:

 for(var key in arr) { if (typeof(arr[key]) == "function") continue; alert(key); } 

但这是一个粗劣的解决方法

对于JavaScript数组的高性能迭代,请使用forwhile循环。 Nicholas Zakas在他的Tech Talk 加速您的JavaScript中讨论了用于迭代数组的最高性能选项。

你最好的select可能是这样的:

 for (var i = collection.length - 1; i >= 0; i--) { if (obj == collection[i]) return true; } 

由于以下几个原因,这种方法将是最好的:

  • 只分配一个局部variables
  • 集合的length属性只能在循环初始化时访问一次
  • 每次迭代,一个局部比较一个常数( i >= 0 )而不是另一个variables