很简单:
for(var propertyName in myObject) {
// propertyName is what you want
// you can get the value like this: myObject[propertyName]
}
现在,您不会以这种方式获取私有变量,因为它们不可用.
EDIT:@bitwiseplatypus是正确的,除非使用hasOwnProperty()
方法,否则将获得继承的属性——然而,我不知道为什么熟悉面向对象编程的人会期望更少的属性!通常,提起这件事的人会受到道格拉斯·克罗克福德(Douglas Crockford)关于这件事的警告,这仍然让我有点困惑.同样,继承是OO语言的正常部分,因此也是JavaScript的一部分,尽管它是原型.
也就是说,hasOwnProperty()
is对于过滤很有用,但我们不需要发出警告,就好像在获取继承属性时存在危险一样.
Edit2:@bitwiseplatypus提出了如果有人在比您最初编写对象(通过其原型)晚的时间点向您的对象添加属性/方法时会发生的情况——虽然这确实可能会导致意外行为,但我个人并不认为这完全是我的问题.只是意见问题.此外,如果我设计的东西在构建对象时使用原型,而代码在对象的属性上进行迭代,并且我想要所有继承的属性,那该怎么办?我不会用hasOwnProperty()
.然后,比如说,有人后来添加了新属性.如果当时情况不好,那是我的错吗?我不这么认为.我认为这就是为什么jQuery作为一个例子,指定了扩展其工作方式的方法(通过jQuery.extend
和jQuery.fn.extend
).