If nothing else it has an amusing name, it’s pronounced “dunder proto” due to the double underscore notation it borrows from python.
The __proto__
property is used to access the prototype chain for an object instance. Don’t know what a prototype chain is? Go take a look here.
So where does it come from? It gets created on any new instance during construction. If construction is done using a constructor function i.e by using the new keyword
var a = new Person()
it will point to the prototype of the constructor function, in this instance Person.prototype
. If done using object literal notation var b = {}
it will point to Object.prototype
. Note that as everything in JavaScript is an object, all objects can follow their prototype chain back to Object.prototype
You can also gain access to the prototype using Object.getPrototypeOf(...)
. MDN provides more on this. You should give this a read if you haven’t already to understand the history of this property.
The following code demonstrates the setup of two very simple object literal and constructor function prototype chains.
//Object literal
var o = {};
o.__proto__ === Object.prototype; //true
o.prototype === undefined; //true
//Constructor function
function Shape(){}
var circle = new Shape();
circle.__proto__ === Shape.prototype; //true
circle.__proto__.__proto__ == Object.prototype; //true
Shape.__proto__ === Function.prototype; //true
More reading.
I’ve already linked them above but as always the MDN docs are a good place to start. There is a great stackoverflow post that has some really valuable insight amongst the many answers and comments.