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

1

11

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!

Chromatogram answered 30/6, 2015 at 7:20 Comment(1)
An instance is an object, and objects are not functions. Object and Function are functions (constructors). Note "object" (as in {}) vs "Object" as in anything that is a JavaScript object.Massachusetts
I
9

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.

Imponderabilia answered 30/6, 2015 at 7:24 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.