开发者

Does JavaScript's for in loop iterate over methods?

开发者 https://www.devze.com 2022-12-24 08:40 出处:网络
In an article on yuiblog Douglas Crockford says that the for in statement will iterate over the methods of an object.Why does the following code not produce [\"a\", \"b\", \"c\", \"d\", \"toString\"]?

In an article on yuiblog Douglas Crockford says that the for in statement will iterate over the methods of an object. Why does the following code not produce ["a", "b", "c", "d", "toString"]? Aren't .toString() and other methods members of my_obj?

Object.开发者_StackOverflow社区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"]


All user defined properties are enumerable, including the properties inherited from prototype. The built-in native properties are not. toString() is one of them. See here https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Statements/For...in

Edit: My interpretation of "However, the loop will iterate over all user-defined properties (including any which overwrite built-in properties)" is that the properties that are overwritten directly in the object become enumerable. Not the overwrite in the prototype itself. That means:

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"]


for..in iterates over user-defined properties. If you change your code to:

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

Then

console.log(a);

Will output:

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

As Chetan Sastry pointed pointed out, toString is treated differently since it is a built-in, native property.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号