Prototype-gebaseerd programmeren

Prototype-gebaseerd programmeren is een vorm van object-georiënteerd programmeren waarin geen klassen aanwezig zijn. In plaats van klassen te gebruiken, wordt een object kopie gemaakt van bestaande objecten, welke dienen als prototypen. Dit model wordt ook wel klasse-loos, 'prototype-georiënteerd' of 'instantie-gebaseerd' programmeren genoemd. Prototyping wordt mogelijk gemaakt door talen die delegation ondersteunen.

De eerste taal die hiervan gebruikmaakt is Self. De populariteit van klasse-loos programmeren is toegenomen sinds JavaScript het idee ook ondersteunt en JavaScript voor complexere software wordt gebruikt. Andere talen zijn: ActionScript, Cecil, NewtonScript, Io, MOO, REBOL, Lisaac en Lua.

Vergelijking met klasse-gebaseerde modellen bewerken

Bij klasse-gebaseerde talen wordt de structuur van objecten bepaald door middel van - door de programmeur bepaalde - typen die men 'klassen' noemt. Klassen definiëren het type data en functionaliteit dat een object zal hebben. Instanties hiervan zijn 'bruikbare' objecten die gebaseerd zijn op deze klasse. In dit model zijn klassen een verzameling van methodes en structuur welke voor alle instanties van deze klasse gelden en ook voor het hele programma zo blijven. Instanties bevatten de data. Het onderscheid tussen klassen en instanties is dus structuur en gedrag (de methodes) aan de ene kant en toestand (de data) aan de andere kant.

Prototype-gebaseerde talen kennen dit onderscheid niet. In plaats van het instantiëren van een klasse, wordt een bestaand (prototype)-object gekopieerd. Waar men een klasse kan zien als een blauwdruk voor een object, bestaat in prototype-gebaseerde talen de basis van objecten al. Daarnaast kunnen ook objecten ex nihilo worden gemaakt. Dit betekent dat tijdens de runtime van het programma objecten kunnen worden aangemaakt. Een ander groot verschil is dat bij prototype-gebaseerde talen, objecten kunnen worden veranderd. Dat wil zeggen dat er tijdens de runtime methodes en properties kunnen worden toegevoegd en verwijderd. Gebeurt dit bij het prototype-object, dan krijgen al de objecten die hier een kopie van zijn, deze verandering mee.