3

From the javascript console in Chrome:

> function Person(name){this.name=name;}
undefined

At this point, Person.prototype should be an empty Object according to the Javascript specs. Let's assign it:

> p=Person.prototype
  > Person

Note that that > Person is clickable and it expands to:

constructor: function Person(name){this.name=name;}
__proto__: Object

But... wasn't it meant to be an empty object? What is all the extra stuff? If you do an alert:

alert(p)

You get [object Object]. Why, when you type it in the Chrome console, does it come out with > Person which expands? Wasn't it meant to be an empty object?

Thank you!

3 Answers 3

10

No, the prototype always has the constructor property which points to the function it is the prototype of. And of course it inherits from an object too, that is the internal __proto__ property.

It is defined in ECMAScript 5 Section 13.2, Creating Function Objects:

(...)

16. Let proto be the result of creating a new object as would be constructed by the expression new Object() where Object is the standard built-in constructor with that name.

17. Call the [[DefineOwnProperty]] internal method of proto with arguments "constructor", Property Descriptor {[[Value]]: F, { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}, and false.

18. Call the [[DefineOwnProperty]] internal method of F with arguments "prototype", Property Descriptor {[[Value]]: proto, { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false}, and false.

(...)

This means nothing else than:

Create a new empty object called proto (16). Define the property constructor on that object and set the value to F (the function itself) (17). Then define the property prototype on the function F and set its value to proto.


If you alert an object, then the object is converted to a string. The default behaviour is to convert an object to the [object Object] string, unless the "special" toString method is overridden.

The Chrome console lists these properties because it is meant for debugging, so you need information. [object Object] is not very informative.

FWIW, an empty object looks like this:

empty object

You can also see the internal __proto__ property here. An empty object always inherits some default properties, but it does not have own properties.

Sign up to request clarification or add additional context in comments.

4 Comments

We need more answers like this. :)
BTW, not too fond of SO's current handling of user references in comments. :\
@FelixKling: So when Chrome shows in the console what seems like a "type", like on someProperty: Type, it is actually displaying the someProperty's value's constructor name?
@Raphael: It seems to be like that. Only if the value is an object though.
0

Chrome's console is a developer tool. It is meant to show in-depth info. In this case, you're looking at the pre-defined properties of the class you just defined.

Comments

0

Those are methods and properites inherited from the Object class.

It discusses the defaults here

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.