Why not just make the darn thing.
A prototype is a playground, if you will. You can test things out, throw them away if they don't work out; iteratively find out how things might work with real users, etc.
Prototypes test specific aspects that are unclear or not yet fully determined and as such are easier to implement on their own than trying to figure out how to integrate something you don't quite know yet into a complete system. This also means that it doesn't hurt too much when throwing them away.
It's not uncommon to implement prototypes without any actual programming. Paper prototypes and interactive PowerPoint slides are examples of that.
Writing production-quality software requires a lot of effort in all areas of the project. If there is a specific part of the system that might be very hard - or even impossible - to implement it is a good idea to write a prototype that displays that it is possible to the solve the problem. When it is known that the problem can be solved, it is more acceptable to spend the time needed to write real production-quality software.
A prototype may also be a way to show a concept to users, which is otherwise hard to explain. In that case the prototype focuses on showing the key features of the concept, but it may e.g. show static data instead of real calculations.
Typically when coding up a prototype you may be a little less careful with your testing and coding standards. The object is to quickly get something working to prove the concept or start a discussion on various aspects of the project. If you determine that it isn't feasible or decide to go in a different direction you've put in less effort to get the decision. Prototypes have a different standard of quality than a finished (or in-progress) product.
Sometimes you will take the prototype and simply refactor it into the actual product. It really depends on how carefully structured the prototype is. Often is best just to use the prototype as the concept and start over, building the real app using your regular process and standards. That way you're product isn't "infected" with the short cuts you took in getting the prototype out quickly. It's also harder to be sure that you've tested adequately when retrofitting a prototype with unit tests because it's much easier to simply write the few "normal" case tests and let it go at that, especially if the code as written is difficult to test. Writing the tests before the code and using coverage analysis helps to make sure that you've both adequately tested it and thought through the design from a testability perspective.
Because coding the damn thing could take many years while a prototype could be done in minutes/hours/days