# Programació basada en prototips

La programació basada en prototips és un estil de programació orientada a objectes en què la reutilització del comportament (coneguda com a herència) es realitza mitjançant un procés de reutilització d'objectes existents que serveixen com a prototips. Aquest model també es pot conèixer com a programació prototípica, orientada a prototips, sense classes o basada en instàncies.
La programació basada en prototips utilitza objectes generalitzats del procés, que després es poden clonar i ampliar. Utilitzant la fruita com a exemple, un objecte "fruita" representaria les propietats i la funcionalitat de la fruita en general. Un objecte "plàtan" es clonaria a partir de l'objecte "fruita" i s'afegirien propietats generals específiques dels plàtans. Cada objecte "plàtan" individual es clonaria a partir de l'objecte genèric "plàtan". Compareu amb el paradigma basat en classes, on una classe "fruita" s'ampliaria amb una classe "plàtan".
El primer llenguatge de programació orientat a prototips va ser Self, desenvolupat per David Ungar i Randall Smith a mitjans de la dècada de 1980 per investigar temes de disseny de llenguatge orientat a objectes. Des de finals de la dècada de 1990, el paradigma sense classes ha crescut cada cop més popular. Alguns llenguatges actuals orientats a prototips són JavaScript (i altres implementacions ECMAScript com JScript i Flash 's ActionScript 1.0), Lua, Cecil, NewtonScript, Io, Ioke, MOO, REBOL i AHK.

## Disseny i implementació

L'herència prototípica en JavaScript és descrita per Douglas Crockford com
"Fer prototips d'objectes i després... fer noves instàncies. Els objectes són mutables en JavaScript, de manera que podem augmentar les noves instàncies, donant-los nous camps i mètodes. Aquests poden actuar com a prototips per a objectes encara més nous. No necessitem classes per fer molts objectes semblants... Els objectes hereten dels objectes. Què podria haver-hi més orientat a objectes que això? »
Els defensors de la programació basada en prototips argumenten que anima el programador a centrar-se en el comportament d'algun conjunt d'exemples i només més tard preocupar-se de classificar aquests objectes en objectes arquetípics que posteriorment s'utilitzen d'una manera similar a les classes. Molts sistemes basats en prototips fomenten l'alteració de prototips durant el temps d'execució, mentre que només uns pocs sistemes orientats a objectes basats en classes (com el sistema dinàmic orientat a objectes, Common Lisp, Dylan, Objective-C, Perl, Python, Ruby)., o Smalltalk) permeten alterar les classes durant l'execució d'un programa.
Gairebé tots els sistemes basats en prototips es basen en llenguatges interpretats i tipificats dinàmicament. Tanmateix, els sistemes basats en llenguatges tipificats estàticament són tècnicament factibles. El llenguatge Omega que es parla a Programació basada en prototips és un exemple d'aquest sistema, tot i que segons el lloc web d'Omega, fins i tot Omega no és exclusivament estàtic, sinó que el seu "compilador pot optar per utilitzar l'enllaç estàtic quan això sigui possible i pot millorar. l'eficiència d'un programa".

## Crítica

Els defensors dels models d'objectes basats en classes que critiquen els sistemes basats en prototips sovint tenen preocupacions similars a les que els defensors dels sistemes de tipus estàtic per a llenguatges de programació tenen els sistemes de tipus dinàmic (vegeu el tipus de dades). Normalment, aquestes preocupacions impliquen la correcció, la seguretat, la predictibilitat, l'eficiència i el desconeixement del programador.

## Referències

* ↑ «Prototype-based programming - MDN Web Docs Glossary: Definitions of Web-related terms | MDN» (en anglès americà), 08-06-2023. [Consulta: 17 desembre 2023].
* ↑ «Understanding and Using Prototypal Inheritance in JavaScript» (en anglès). [Consulta: 17 desembre 2023].
* ↑ Taivalsaari, Antero. «Section 1.1». A: Classes vs. Prototypes: Some Philosophical and Historical Observations (en anglès), 1996, p. 44–50.
* ↑ Blaschek, Günther. «Section 2.8». A: Omega: Statically Typed Prototypes, p. 177.