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数组的高性能迭代,请使用for
或while
循环。 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