In Javascript, any "function object" has a prototype
> F = function() {}
F()
> F.prototype
F {}
But "object" or "instance" doesn't have a prototype
> o = {}
Object {}
> o.prototype
undefined
> f = new F()
F {}
> f.prototype
undefined
However, the built-in object "Function" and "Object" have a prototype:
> Function.prototype
Empty()
> Object.prototype
Object {}
This looks quite confusing for me.
Function
and "function object" have a prototype property
Object
has a prototype property, but "object literal" and "instance object" doesn't have a prototype property
What does the prototype
property actually mean? In the example above, shouldn't the prototype
property of f
be F
?
Does anyone have ideas about how to explain this? Thanks!
Don't confuse the prototype attribute of a function with the internal prototype of an object (which places the object in the prototype chain).
Function
and Object
are constructor functions, as such, they have a prototype attribute, which will be assigned as the internal prototype of objects created with these constructor functions.
I recommend Eloquent Javascript's chapter "The secret life of objects", particularly for this quote:
It is important to note the distinction between the way a prototype is associated with a constructor (through its
prototype
property) and the way objects have a prototype (which can be retrieved withObject.getPrototypeOf
). The actual prototype of a constructor is Function.prototype since constructors are functions. Itsprototype
property will be the prototype of instances created through it but is not its own prototype.