A customer at the local ProtoMart supermarket takes her basket of groceries to the checkout.
The checkout guy takes the first item from the basket, a prawn and mayo sandwich, and looks to see if there is a price sticker on the packaging. The sandwich might be reduced price or on sale or part of a special promotion. It turns out there's a bright orange sticker showing the original price crossed out and a new price written in pen. So the sandwich is put through the till at its own special price.
The second item is a can of cola. It doesn't have a price sticker on it but "beep!" and it's scanned at the checkout. The store database passes the price of those cans to the till and the conveyor keeps rolling.
Sometime earlier, a hapless and inexperienced store drone had come across a delivery of new triple chocolate cookies and decided they looked so good they had to go straight out onto the shelves. There they'd been seen by our shopper who was equally unable to resist their crumbly goodness. So, now, here they are as the third item out of the basket. They have no sticker giving their price and "booop!" the scanner complains. "Booop!" "Booop!" The checkout guy tightens the packaging and tries them upside down. "Booop!" Typing the code into the computer brings no solution.
After several more obstinate booops and some heavyweight frowning by the checkout guy, a store 'solutions expert' appears on roller skates. "Nice cookies!" she nods, "but not on the system. I'll ring regional price control."
In the end regional price control supplied the price for the cookies; they were very expensive but well worth it. The store drone was reprimanded and banned from the shop front.
When trying to retrieve the property of an object, the object itself is checked first. If it can supply the answer then that answer is taken as the value of the property. If it can't supply the answer then where do we go next?
The object's prototype property points to an object that will try and supply the answer if the object itself cannot. That's it. The original object just passes responsibility for finding a value for that property to another object. "Check the database", "Ask the boss", "Ring the help-desk".
If the object acting as the prototype doesn't have the answer then it passes the search on to its prototype object. "I'm not sure. You'd better ask the regional manager."
The search continues from prototype to prototype until "Deep Thought" is reached, Object, the last hope in the quest for knowledge.
If Object doesn't have the answer then the property is set to "undefined".
Since an object's prototype is simply set as a property pointing to an object, it's very easy to chop and change where an object gets its information and functionality from. "If you're stuck, ask the help-desk. Oh, but if it's Tuesday then check with the regional manager instead."
If you want to be a bird, set your prototype property to new Bird() and now you can use its methods. Cheep inheritance.