8

在yuiblog 上的一篇文章中,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"]
4

2 回答 2

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"]
于 2010-03-30T01:49:23.090 回答
3

for..in迭代用户定义的属性。如果您将代码更改为:

Object.prototype.foo = function() { return 'abc'; };

然后

console.log(a);

将输出:

["a", "b", "c", "foo", "d"]

正如Chetan Sastry指出的那样,toString由于它是内置的本地属性,因此被区别对待。

于 2010-03-30T01:44:01.497 回答