8

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

2 Answers 2

12

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"] 
Sign up to request clarification or add additional context in comments.

2 Comments

Yep, Object.prototype.toString.propertyIsEnumerable() == false
From the document you linked: "A for...in loop does not iterate over built-in properties. These include all built-in methods of objects, such as String's indexOf method or Object's toString method. However, the loop will iterate over all user-defined properties (including any which overwrite built-in properties)." Why does the document say that "including any which overwrite built-in properties" if in my example .toString() is not overwritten?
3

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.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.