Understanding JavaScript Prototypes.
JavaScript’s prototype object generates confusion wherever it goes. Seasoned JavaScript professionals, even authors frequently exhibit a limited understanding of the concept. I believe a lot of the trouble stems from our earliest encounters with prototypes, which almost always relate to new, constructor and the very misleading prototype property attached to functions. In fact prototype is a remarkably simple concept. To understand it better, we just need to forget what we ‘learned’ about constructor prototypes and start again from first principles.
What is a prototype?
A prototype is an object from which other objects inherit properties
Can any object be a prototype?
Yes.
Which objects have prototypes?
Every object has a prototype by default. Since prototypes are themselves objects, every prototype has a prototype too. (There is only one exception, the default object prototype at the top of every prototype chain. More on prototype chains later)
OK back up, what is an object again?
An object in JavaScript is any unordered collection of key-value pairs. If its not a primitive (undefined, null, boolean, number or string) its an object.
You said every object has a prototype. But when I write ({}).prototype I get undefined. Are you crazy?
Forget everything you learned about the prototype property – it’s probably the biggest source of confusion about prototypes. The true prototype of an object is held by the internal [[Prototype]] property. ECMA 5 introduces the standard accessor Object.getPrototypeOf(object) which to-date is implemented in Firefox, Safari, Chrome and IE9. In addition all browsers except IE support the non-standard accessor __proto__. Failing that we can ask the object’s constructor for its prototype property.
var a = {};
//Fails in Opera or IE<=8
Object.getPrototypeOf(a); //[object Object]
//Fails in IE
a.__proto__; //[object Object]
//all browsers
//(but only if constructor.prototype has not been replaced and fails with Object.create)
a.constructor.prototype; //[object Object]
Ok fine, but false is a primitive, so why does false.__proto__ return a value?
When a primitive is asked for it’s prototype it will be coerced to an object.
//(works in IE<=8 too, due to double-negative) false.__proto__ === Boolean(false).__proto__; //true
I want to use prototypes for inheritance. What do I do now?
It rarely makes sense to set a prototype for one instance and only one instance, since it would be equally efficient just to add properties directly to the instance itself. I suppose if we have created a one off object which we would like to share the functionality of an established object, such as Array, we might do something like this (in __proto__ supporting browsers).
//fails in IE<=8
var a = {};
a.__proto__ = Array.prototype;
a.length; //0
But the real power of prototype is seen when multiple instances share a common prototype. Properties of the prototype object are defined once but inherited by all instances which reference it. The implications for performance and maintenance are obvious and significant.
So is this where constructors come in?
Yes. Constructors provide a convenient cross-browser mechanism for assigning a common prototype on instance creation.
Just before you give an example I need to know what this constructor.prototype property is all about?
OK. Firstly JavaScript makes no distinction between constructors and other functions, so every function gets a prototype property. Conversely, anything that is not a function does not have such a property.
//function will never be a constructor but it has a prototype property anyway
Math.max.prototype; //[object Object]
//function intended to be a constructor has a prototype too
var A = function(name) {
this.name = name;
}
A.prototype; //[object Object]
//Math is not a function so no prototype property
Math.prototype; //null
So now the definition: A function’s prototype property is the object that will be assigned as the prototype to all instances created when this function is used as a constructor.
It’s important to understand that a function’s prototype property has nothing to do with it’s actual prototype.
//(example fails in IE)
var A = function(name) {
this.name = name;
}
A.prototype == A.__proto__; //false
A.__proto__ == Function.prototype; //true - A's prototype is set to its constructor's prototype property
Example please?
You’ve probably seen and used this a hundred times but here it is once again, maybe now with added perspective.
//Constructor. <em>this</em> is returned as new object and its internal [[prototype]] property will be set to the constructor's default prototype property
var Circle = function(radius) {
this.radius = radius;
//next line is implicit, added for illustration only
//this.__proto__ = Circle.prototype;
}
//augment Circle's default prototype property thereby augmenting the prototype of each generated instance
Circle.prototype.area = function() {
return Math.PI*this.radius*this.radius;
}
//create two instances of a circle and make each leverage the common prototype
var a = new Circle(3), b = new Circle(4);
a.area().toFixed(2); //28.27
b.area().toFixed(2); //50.27
That’s great. And if I change the constructor’s prototype, even existing instances will have access to the latest version right?
Well….not exactly. If I modify the existing prototype’s property then this is true, because a.__proto__ is a reference to the object defined by A.prototype at the time it was created.
var A = function(name) {
this.name = name;
}
var a = new A('alpha');
a.name; //'alpha'
A.prototype.x = 23;
a.x; //23
But if I replace the prototype property with a new object, a.__proto__ still references the original object.
var A = function(name) {
this.name = name;
}
var a = new A('alpha');
a.name; //'alpha'
A.prototype = {x:23};
a.x; //null
What does a default prototype look like?
An object with one property, the constructor.
var A = function() {};
A.prototype.constructor == A; //true
var a = new A();
a.constructor == A; //true (a's constructor property inherited from it's prototype)
What does instanceof have to do with prototype?
The expression a instanceof A will answer true if a’s prototype falls within the same prototype chain as A’s prototype property. This means we can trick instanceof into failing
var A = function() {}
var a = new A();
a.__proto__ == A.prototype; //true - so instanceof A will return true
a instanceof A; //true;
//mess around with a's prototype
a.__proto__ = Function.prototype;
//a's prototype no longer in same prototype chain as A's prototype property
a instanceof A; //false
So what else can I do with prototypes?
Remember I said that every constructor has a prototype property which it uses to assign prototypes to all instances it generates? Well that applies to native constructors too such as Function and String. By extending (not replacing!) this property we get to update the prototype of every instance of the given type.
I’ve used this technique in numerous previous posts to demonstrate function augmentation. For example the tracer utility I introduced in my last post needed all string instances to implement times, which returns a given string duplicated a specified number of times
String.prototype.times = function(count) {
return count < 1 ? '' : new Array(count + 1).join(this);
}
"hello!".times(3); //"hello!hello!hello!";
"please...".times(6); //"please...please...please...please...please...please..."
Tell me more about how inheritance works with prototypes. What’s a prototype chain?
Since every object and every prototype (bar one) has a prototype, we can think of a succession of objects linked together to form a prototype chain. The end of the chain is always the default object’s prototype.
a.__proto__ = b;
b.__proto__ = c;
c.__proto__ = {}; //default object
{}.__proto__.__proto__; //null
The prototypical inheritance mechanism is internal and non-explicit. When object a is asked to evaluate property foo, JavaScript walks the prototype chain (starting with object a itself), checking each link in the chain for the presence of property foo. If and when foo is found it is returned, otherwise undefined is returned.
What about assigning values?
Prototypical inheritance is not a player when property values are set. a.foo = ‘bar’ will always be assigned directly to the foo property of a. To assign a property to a prototype you need to address the prototype directly.
And that about covers it. I feel I have the upper hand on the prototype concept but my opinion is by no means the final word. Please feel free to tell me about errors or disagreements.
Where can I get more information on protoypes?
I recommend this excellent article by Dmitry A. Soshnikov




Another well researched post, Angus! One nitpick, you say:
“Prototypical inheritance is not a player when property values are set. a.foo = ‘bar’ will always be assigned directly to the foo property of a. To assign a property to a prototype you need to address the prototype directly.”
It is possible (though, not cross-browser, I have only tested with FF and Chrome, IE definitely won’t) to define setters and getters for properties via
As always, MDC has a great article: https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Working_with_Objects#Defining_Getters_and_Setters
Thanks Nick – Yeah I know, ECMA 5 is standardizing get and set properties too. But I wanted to keep it simple and also caution against having one instance update the prototype. Nice point though
This is a good overview.
undefined is returned, but not null — http://dmitrysoshnikov.com/ecmascript/chapter-7-2-oop-ecmascript-implementation/#get-method
P.S.: It is good nevertheless to mention a list of used/additional literature on which your article is based
For details: http://dmitrysoshnikov.com/ecmascript/chapter-7-2-oop-ecmascript-implementation/
Dmitry.
Dmitry, Yes good correction. Also thanks for including you article references
Apologies for not mentioning your article
You’ll notice from my other posts I am always happy to credit sources . I do not think my article is based on your article but I did make use use of your perfect definition of object and I gained inspiration from re-reading your article while writing mine, and it reminded me to cover some points. Thank you.
BTW I would encourage all readers to check out Dmitry’s entire ECMA series. It’s fantastic.
http://dmitrysoshnikov.com/2010/04/
Pingback: links for 2010-06-27 « Treat with Jermolene
Pingback: Understanding JavaScript Prototypes. « JavaScript, JavaScript « Guide Weblog
Pingback: Understanding JavaScript Prototypes. « JavaScript, JavaScript « Information Site Weblog
Hey. Thanks for this great article. I have been using JS many years as small scripting language, but now I’m creating really big project fully in JS, and wanted to know what is really going in all details in it. Could not find anything useful, wanted to start reading Mozilla Documentation, and noticed your article on reddit.
Nice. Saved me some time.
How about setters and getters? How they cover assigning properties?
Hi Witek, glad this was helpful
>>How about setters and getters? How they cover assigning properties?
Do you mean in respect to prototypes, or is this a suggestion for another blog topic?
Yes what is their connection (or how they could be connecte) with prototype chains?
Citing: “Prototypical inheritance is not a player when property values are set. a.foo = ‘bar’ will always be assigned directly to the foo property of a. To assign a property to a prototype you need to address the prototype directly.”
But what if foo is a setter in a prototype? Well do not know how to define it, but could be useful.
Nick Fitzgerald mentioned this in an earlier comment
In some browsers you can do this:
A.prototype.__defineSetter__(“b”, fn);
(https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Working_with_Objects#Defining_Getters_and_Setters)
By the way, accessors have been standardized in ECMA5 (see http://dmitrysoshnikov.com/ecmascript/es5-chapter-1-properties-and-property-descriptors/#named-accessor-property)
I’m not sure I recommend this approach for prototypes though
Pingback: Understanding JavaScript Prototypes. « JavaScript, JavaScript « Blog Weblog
Pingback: Understanding JavaScript Prototypes. « JavaScript, JavaScript « Guide Weblog
Pingback: Understanding JavaScript Prototypes. « JavaScript, JavaScript « Info Weblog
Pingback: Understanding JavaScript Prototypes. « JavaScript, JavaScript | Uber Daily
Great post! I’ve used this numerous times just trying to figure all this out.
I do have one thing that is confusing me a little, though. Your description of how instanceOf is defined is confusing to me a little. Wouldn’t it be better to define
a instanceOf A
as being true whenever A.prototype falls in a’s prototype chain.
Consider the following scenario. Assume you have created a class called USADate which derives from Date, and further assume we have created instances of each called respectively aUSADate and aDate. According to your definition, wouldn’t the following be true, even though it really isn’t?
aUSADate instanceOf Date,
I may just not be understanding correctly, since I am new to this. Any explanation would be appreciated, and again, thanks for the great blog post.
Hi Timothy – thanks for the nice comments
I think your definition “whenever A.prototype falls in a’s prototype chain” is pretty much word for word the same as mine.
But in your example:
is true, assuming that by “derives from” you mean USADate inherits from Date’s prototype
A simpler example of the same thing (remember Object’s prototype is at the top of all prototype chains):
function A() {}; var a = new A(); a instanceof Object; //truePingback: Prototypal Inheritance in JavaScript « Rupesh kumar Tiwari
Pingback: Cor Cinza » JavaScript for the PHP programmer
cool post
. there is something about the prototype thing that blows my head off
If my class inherits from another class then there is no valid way anymore to add getters and setters (with valid i not mean things like “__defineGetter__” , “__defineSetter__”,”__proto__”). If im not totaly of the road getters an setters should be defined like this:

var car = function(){};
new car();
car.prototype =
{
_a:0,
get a(){return this._a},
set a(x){this._a=x}
};
but if i try to inherit cars
var audi = function(){};
new audi();
audi.prototype = new car;
// that clearly couldnt work
audi.prototype =
{
_b:10,
get b(){return this._b},
set b(x){this._b=x}
};
there are some workarounds:
extend(audi,car);
//workaround 1 (Firefox and Crome only)
function extend(child, supertype){
child.prototype.__proto__ = supertype.prototype;
}
//workaround 2 (all browsers but dirty!)
function extend(child, super){
for (var property in super.prototype) {
if (typeof child.prototype[property] == "undefined")
child.prototype[property] = super.prototype[property];
}
return child;
}
is there another way?
Thanks Andy
Check out this post for an example on inheritance using prototypes – but beware JavaScript is not Java (etc.) and classical inheritance is less suited to the language
I just started looking at jPaq’s Color object, and must say that it is quite interesting what Chris West did. It seems that he has made a way of keeping private variables private. For anybody that is interested, I would definitely take a look at how he implemented this object.
Pingback: JavaScript is Awesome and Ubiquitous « Cootcraig's Blog
IE9 also has Object.getPrototypeOf(object). Last time I checked, IE9 had the most complete implementation of ECMA5 features of any released browser (and IE10 adds strict mode)
Pingback: Javascript – How Prototypal Inheritance really works | Vjeux
Excellent article. Thanks a million! I have been reading a lot of stuff to get an understanding of the prototype. This is where my quest ends. If you are interested in the philosophical reasoning behind prototypical object orientation as opposed to the popular classical object orientation then this paper is a must read.
@Rahul glad to help – that’s quite a paper! Plato and Aristotle are cited – I look forward to reading it properly
As a relatively new javascript programmer, I really appreciated this article. Thank you for keeping it so clear and uncluttered with all the exceptions or possibilities that usually come with programming. The question/answer style made the concepts very easy to follow.
Pingback: Code snippet « monkeylearns
Thanks for your explanation, this really helps me understand prototype better.
You did understand what confused so many programmers, the prototype property of a function. I read several books on javascript, none of them gets the points on this.
Pingback: Link-urile săptămânii 27 iunie – 3 iulie | Staicu Ionuţ-Bogdan
Nice & very insightful article about prototypes.
I want to clarify my understandings a little but at the core level.
Citing two statements from above article:
> Every object has a prototype by default
and
> OK. Firstly JavaScript makes no distinction between constructors and other functions, so every function gets a prototype property. Conversely, anything that is not a function does not have such a property.
When you mean, only functions will have prototype property, both Object and Functions (which are actually Objects, of course) will have prototypes, but it is just functions that will have ‘prototype’ property accessible for explicit use. But objects (var a = {}) will also have implicit, non-accessible prototype object. Is my understanding correct?
And if I m correct and we can’t get the prototype of an object (not a function), means we can’t make a object inherit from other object. Correct?
Thanks once again
ManiKanta
Hi Mani,
Thanks for the nice words!
To clarify, all objects have a prototype (an internal property, represented in some browsers by the “__proto__” identifier) but only functions have a property named “prototype”. The “prototype” property does not represent the prototype of the function, it references the prototype that will be assigned to instances created when that function acts as a constructor.
var myConstructor = function() {};
var myInstance = new myConstructor();
//(‘__proto__’ not available in all browsers)
myInstance.__proto__ === myConstructor.prototype; //true
Hope this helps!
Angus
Thanks Argus. Thanks for clarifying again and that means I understood it correct.
And about my second question:
> And if I m correct and we can’t get the prototype of an object (not a function), means we can’t make a object inherit from other object. Correct?
I came to know the answer from one of your other post: http://javascriptweblog.wordpress.com/2010/03/16/five-ways-to-create-obejcts-part-2-inheritance/ – 3. Constructor using Object Literal way.
Thanks
ManiKanta
OK, sorry I misread your original question slightly.
Also note that as of ES5 you can use Object.create to make such inheritance a little easier
//won’t work in IE<9
var myConstructor1 = function() {};
myConstructor1.prototype.prop1 ='apple';
var myPrototype2 = Object.create(myConstructor1.prototype);
myPrototype2.prop2 = 'pear';
var myConstructor2 = function() {};
myConstructor2.prototype = myPrototype2;
var myInstance2 = new myConstructor2;
myInstance2.prop1; //apple
myInstance2.prop2; //pear
Very interesting….thanks!
Pingback: #JavaScript wait untill a function/method finished executing « Gert-Jan Jansma
Really good article. Now I think I am finally getting the hang of it. Thanks a lot!
Pingback: 理解JavaScript原型 - 博客 - 伯乐在线
Pingback: Closures, Javascript, and Objects – Part II | In the trenches
Pingback: 2011 December : What I'm Reading
Excellent article that clarifies a lot!
Good effort but I don’t think even this article makes much sense to beginners or even intermediate javascript developers. This is yet another confusing article.
Let’s forget about complexities and be as simple as this guy has done:
http://timkadlec.com/2008/01/using-prototypes-in-javascript/
This is all one needs to know without going into any complexities and reading all over again and again or searching elsewhere to dig into the topic further.