3 回答

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

TA贡献1854条经验 获得超8个赞
for..in
var myObject = {foo: 'bar'};for (var name in myObject) { alert(name);}// results in a single alert of 'foo'Object.prototype.baz = 'quux';for (var name in myObject) { alert(name);}// results in two alerts, one for 'foo' and one for 'baz'
hasOwnProperty()
:
for (var name in myObject) { if (myObject.hasOwnProperty(name)) { alert(name); }}
编辑:
hasOwnProperty()
hasOwnProperty()
.

TA贡献1836条经验 获得超13个赞
for (var name in myObject) { alert(name);}
var obj = { toString: 12};for (var name in obj) { alert(name);}
isPrototypeOf
hasOwnProperty
toLocaleString
toString
valueOf
for (var key in myObject) { alert(key);}var shadowedKeys = [ "isPrototypeOf", "hasOwnProperty", "toLocaleString", "toString", "valueOf"];for (var i=0, a=shadowedKeys, l=a.length; i<l; i++) { if map.hasOwnProperty(a[i])) { alert(a[i]); }}
Object.keys(myObject)

TA贡献1909条经验 获得超7个赞
添加回答
举报