【问题标题】:Is there a jQuery way of iterating over an objects own properties only?是否有一种 jQuery 方法仅迭代对象自己的属性?
【发布时间】:2012-11-21 05:15:27
【问题描述】:

我正在制作一个类似 jQuery 的小型库,让我感到奇怪的是$.each 的行为。

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

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

这样做的问题在于,它还将迭代继承属性,即来自对象构造函数原型的属性。

例如,使用hasOwnProperty 可以知道这一点。而jQuery 可以做到这一点。

但是,当您将一个对象传递给$.each 时,它的行为完全 就像for...in 一样,也会迭代继承的属性。它也应该稍微慢一些,并且需要输入更多字符。

查看this fiddle 以查看它的实际效果,查看look here 以获取$.each 的源代码。

所以我的问题是,jQuery 中是否有一个 object 迭代方法只包含自己的属性?如果不是,图书馆应该像这样吗?

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

【问题讨论】:

  • 找到它的唯一方法是使用hasOwnPropertyjsfiddle.net/mpTkA/2
  • 在较新的浏览器中还有Object.keys()
  • @Pointy,很高兴知道)getOwnPropertyNames 可能会更好
  • 快速说明: 确保如果您使用本机 for-in,则将 var 用于 keyfor (var key in obj)。否则你会得到一个意外的全局。 (除非您真的希望 key 是全局性的,在这种情况下,您可能应该找到一种更好的方法来做您想做的任何事情。)其他快速说明: 使用 hasOwnProperty 时,保存引用而不是通过点表示法调用它可能会更安全一些:var has = Object.prototype.hasOwnProperty; has.call({abc: 'xyz'}, 'abc');.

标签: javascript jquery iteration for-in-loop hasownproperty


【解决方案1】:

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

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

【讨论】:

  • “一些场景”部分是我想不通的部分。你有什么例子吗? (而且,如果必须添加hasOwnProperty 检查,也可以使用for...in 并节省一些输入)。
  • 例如:defaultAjaxSettings={type:"GET",...},然后创建一个具有某些特定设置但其余部分继承自默认设置的克隆?
  • 我明白了……但通常人们会使用 $.extend 之类的东西来处理选项映射中的默认值,对吧?或者在某些框架中,通过继承更常见的是这样做?
  • 对...老实说我不知道​​。显然,当您需要将更改传播到默认设置时,您会希望使用继承,但我没有更好的示例。
  • 另外,我认为 $.each 的兴趣在于提供一个与各种集合(对象、数组)一起工作的抽象层,这在模板等某些场景中可能很有趣。但同样我没有具体的例子......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 2023-03-24
  • 2017-02-19
  • 1970-01-01
相关资源
最近更新 更多