The three words describe different levels of detail and different questions. A wireframe asks "what goes where?" A mockup asks "what does it look like?" A prototype asks "does it work for people?"
Wireframes use simple shapes and placeholder text to show layout, hierarchy and content. They are quick to make and quick to throw away, which is exactly why they are useful: you can explore many structures before committing to one.
Mockups add the real visual design: colour, typography, images and components. They are good for agreeing on the look with stakeholders and for handoff, but they cannot show how anything behaves.
Prototypes add interaction. A low-fidelity prototype might link wireframes together to test a flow. A high-fidelity prototype looks and behaves close to the final product, with states, transitions and sometimes real data, so you can run usability tests that reveal real problems.
The gap after the prototype is the handoff: developers usually rebuild what the prototype shows. For interactive components, ExodeUI, which we make, closes that gap by making the interactive file itself the thing that ships in the app.