在yuiblog上的article中,Douglas Crockford说for in
语句将迭代对象的方法。为什么以下代码不会产生[“a”,“b”,“c”,“d”,“toString”]?是不是.toString()和my_obj的其他方法成员?
Object.prototype.toString = function(){return 'abc'}
Object.prototype.d = 4;
my_obj = {
'a':1,
'b':2,
'c':3
}
a = []
for (var key in my_obj) {
a.push(key)
}
console.log(a) // prints ["a", "b", "c", "d"]
答案 0 :(得分:12)
所有用户定义的属性都是可枚举的,包括从原型继承的属性。内置的本机属性不是。 toString()
就是其中之一。见https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Statements/For...in
编辑:我对的解释“但是,循环将迭代所有用户定义的属性(包括覆盖内置属性的任何属性)”是属性在对象中直接覆盖的内容变得可枚举。不是原型本身的覆盖。这意味着:
var my_obj = {a: 1, b: 2, c: 3};
my_obj.toString = function() {return 'abc';};
a = []
for (var key in my_obj) {
a.push(key)
}
console.log(a) // prints ["a", "b", "c", "toString"]
答案 1 :(得分:3)
for..in
遍历用户定义的属性。如果您将代码更改为:
Object.prototype.foo = function() { return 'abc'; };
然后
console.log(a);
将输出:
["a", "b", "c", "foo", "d"]
正如Chetan Sastry指出的那样,toString
被区别对待,因为它是一个内置的本机属性。