2012-12-03 128 views
4

我正在制作一个小型的类似jQuery的库,有一件令我奇怪的事情是$.each的行为。是否有jQuery方法遍历对象自己的属性只?

在JavaScript中,我们有一个for...in循环:

for (var key in obj) { 
    console.log(key + ': ' + obj[key]); 
} 

这里的问题是,它会遍历继承性质为好,也就是说,从性能对象的构造函数的原型来。例如,可以使用hasOwnProperty知道这个。和jQuery 可以做到这一点。

但是,当你传递一个对象来$.each,它的行为完全for...in,遍历继承属性为好。它也应该稍微慢一点,并且需要输入更多的字符。

检查this fiddle看到它在行动和look here的源代码$.each

所以我的问题是,有没有一个对象 jQuery中的迭代方法,只包括自己的属性?如果不是,图书馆的行为应该是这样吗?

编辑:由于jQuery不这样做,你也可以回答这是否有用。我的意思是,我看不到自己想要迭代原型属性,但也许我错过了一些东西。

+0

看看这里太http://stackoverflow.com/questions/1827458/prototyping-object-in-javascript-breaks-jquery – mplungjan

+1

找到它是通过使用'hasOwnProperty'的唯一途径。 http://jsfiddle.net/mpTkA/2/ –

+1

在新的浏览器中还有'Object.keys()'。 – Pointy

回答

1

jQuery的行为是有道理的,因为您可以随时选择在循环中添加hasOwnProperty检查 - 或者不。

我可以看到循环通过继承属性可能会在某些情况下(克隆或子类或任何你称之为)有用。

+1

“一些场景”部分是我无法弄清楚的部分。你有什么样的例子吗? (并且,如果必须添加'hasOwnProperty'检查,则可以使用'for ... in'并保存一些输入)。 –

+0

例如:defaultAjaxSettings = {type:“GET”,...},然后创建一个具有某些特定设置的克隆,但剩下的部分会继承默认设置? – Christophe

+1

我明白了...但通常会使用'$ .extend'来处理选项图中的默认值,对吧?或者在一些框架中,通过继承来做到这一点更为常见? –