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.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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With