有没有一种jQuery的方法只迭代一个对象自己的属性?

4
我正在制作一个类似 jQuery 的小型库,其中一个让我感到奇怪的事情是 $.each 的行为。
在 JavaScript 中我们有一个 for...in 循环:
for (var key in obj) {
    console.log(key + ': ' + obj[key]);
}

问题在于它也会迭代继承的属性,也就是来自对象构造函数原型的属性。例如,可以使用hasOwnProperty 来了解这一点。JQuery也可以这样做。但是,当你将一个对象传递给$.each时,它的行为与for...in完全相同,也会迭代继承的属性。 这也应该稍微慢一些,并且需要输入更多字符。请查看this fiddle以查看其实际效果,以及查看$.each的源代码look here。所以我的问题是,jQuery中是否有仅包括自有属性的对象迭代方法?如果没有,那么库应该像这样运作吗?

编辑:由于jQuery不支持此操作,你也可以回答这是否有用。我的意思是,我不认为自己会想要遍历原型属性,但也许我漏掉了什么。


1
唯一找到它的方法是使用 hasOwnProperty。http://jsfiddle.net/mpTkA/2/ - Selvakumar Arumugam
1
在较新的浏览器中也有 Object.keys() - Pointy
1
@Pointy,好知道)可能getOwnPropertyNames会更好。 - dmi3y
如果你需要支持IE8,就不能这样做。 - Camilo Martin
1
快速提示:确保在使用本机 for-in 时为 key 使用 varfor (var key in obj)。否则,您会获得意外的全球变量。(除非您真的希望 key 是全局的,在这种情况下,您应该找到更好的方法来完成您想要做的事情)其他快速提示:在使用 hasOwnProperty 时,保存引用比通过点符号调用它稍微更安全:var has = Object.prototype.hasOwnProperty; has.call({abc: 'xyz'}, 'abc'); - Keen
显示剩余7条评论
1个回答

1

jQuery的行为是有意义的,因为您始终可以选择在循环中添加hasOwnProperty检查 - 或者不添加。

我可以看出,在某些情况下(克隆或子类或其他称呼),遍历继承属性可能会很有用。


1
“一些情景” 部分是我无法想出的。你有任何例子吗?(如果必须添加 hasOwnProperty 检查,一个人可以使用 for...in 语句并节省一些打字时间)。 - Camilo Martin
例如:如果默认的Ajax设置是defaultAjaxSettings={type:"GET",...},那么如何创建一个克隆对象,该对象具有某些特定的设置,但其余设置继承自默认设置? - Christophe
1
我明白了...但通常人们会使用类似于$.extend的方法来处理选项映射中的默认值,对吧?或者在某些框架中,使用继承的方式更为常见? - Camilo Martin
说实话,我不知道。显然,当您需要传播更改到默认设置时,您会想要使用继承,但我没有更好的例子。 - Christophe
另外,我认为$.each的优点在于提供了一个抽象层,可以与各种集合(对象、数组)一起使用,在某些场景下可能很有趣,比如模板化。但是我没有具体的例子... - Christophe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接