Search code examples
javascriptoopfunctional-programmingprototypeprototype-programming

In Javascript, why is there no "prototype" property for an instance or object literal?


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.

  1. Function and "function object" have a prototype property

  2. 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!


Solution

  • 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 with Object.getPrototypeOf). The actual prototype of a constructor is Function.prototype since constructors are functions. Its prototype property will be the prototype of instances created through it but is not its own prototype.