Cosa significa che Javascript è un linguaggio basato su prototipi?

Uno dei principali vantaggi di Javascript è che si tratta di un linguaggio basato su prototipi.

Ma cosa significa che Javascript è basato sul prototipo e perché è un vantaggio?

L’ereditarietà prototipale è una forma di riutilizzo del codice orientato agli oggetti. Javascript è uno dei pochi linguaggi orientati agli oggetti [mainstream] ad utilizzare l’ereditarietà prototipale. Quasi tutti gli altri linguaggi orientati agli oggetti sono classici.

Nell’ereditarietà classica , il programmatore scrive una class che definisce un object. Più oggetti possono essere istanziati dalla stessa class, in modo da avere il codice in un posto che descrive diversi oggetti nel tuo programma. Le classi possono quindi essere organizzate in una gerarchia, favorendo il riutilizzo del codice. Il codice più generale è memorizzato in una class di livello superiore, da cui ereditano le classi di livello inferiore. Ciò significa che un object sta condividendo il codice con altri oggetti della stessa class, così come con le sue classi genitore.

Nel modulo di ereditarietà prototipale , gli oggetti ereditano direttamente da altri oggetti. Tutto il business delle lezioni va via. Se vuoi un object, scrivi semplicemente un object. Ma il riutilizzo del codice è ancora una cosa preziosa, quindi gli oggetti possono essere collegati tra loro in una gerarchia. In javascript, ogni object ha un link segreto all’object che lo ha creato, formando una catena. Quando viene chiesto a un object una proprietà che non ha, verrà chiesto all’object padre … continuamente la catena fino a quando la proprietà non viene trovata o finché non viene raggiunto l’object radice.

Ogni funzione in JavaScript (che sono oggetti stessi) ha effettivamente un membro chiamato “prototipo”, che è responsabile della fornitura di valori quando gli viene richiesto un object. Avere questo membro consente al meccanismo di costruzione (tramite il quale gli oggetti sono costruiti da funzioni) di funzionare. L’aggiunta di una proprietà al prototipo di un object funzione lo renderà disponibile per l’object costruito, nonché per tutti gli oggetti che ne ereditano.

vantaggi

Potrebbe non esserci una regola ferrea sul perché l’eredità prototipale sia una forma vantaggiosa di riutilizzo del codice. Il riutilizzo del codice stesso è vantaggioso, e l’eredità prototipale è un modo ragionevole per affrontarlo. Si potrebbe sostenere che l’eredità prototipale è un modello abbastanza semplice di riutilizzo del codice e che il codice può essere pesantemente riutilizzato in modo diretto . Ma le lingue classiche sono certamente in grado di realizzare anche questo.

Sidenote: @Andrew Hedges fa un buon punto, che ci sono in realtà molte lingue prototipali. Vale la pena notare che questi altri esistono, ma vale la pena notare che nessuno di loro è qualcosa di simile al mainstream. NewtonScript sembrava avere una certa trazione per un po ‘, ma è morto con la sua piattaforma. È anche ansible estendere alcune lingue moderne in modi che aggiungono funzionalità prototipali.

Un linguaggio basato su prototipi, non fa la distinzione delle classi rispetto agli oggetti: ha semplicemente degli oggetti. Un linguaggio basato sul prototipo ha la nozione di un object prototipo, un object usato come modello da cui ottenere le proprietà iniziali per un nuovo object. Qualsiasi object può specificare le sue proprietà, sia quando lo crei o in fase di esecuzione. Inoltre, qualsiasi object può essere associato come prototipo per un altro object , consentendo al secondo object di condividere le proprietà del primo object.

La programmazione basata su prototipi è uno stile di programmazione orientata agli oggetti in cui le classi non sono presenti e il riutilizzo del comportamento (o l’ereditarietà in linguaggi basati su classi) viene eseguito clonando oggetti esistenti che fungono da prototipi.

Il vantaggio / svantaggio è che possiamo creare nuovi tipi di oggetti in fase di esecuzione senza necessità di definire classi (codice statico). Come la maggior parte delle funzionalità, è compito dello sviluppatore trasformarlo in vantaggio / svantaggio.

Sopra è ansible perché gli oggetti sono essenzialmente funzioni nello script java (anche le chiusure).

Invece di dichiarare una struttura di class, puoi creare oggetti dello stesso tipo e aggiungerli alla loro definizione ogni volta che ti piace utilizzare il prototipo dell’object. È più flessibile del normale modo di fare le cose.

Se si utilizzano oggetti in runtime anziché una class in compilazione per creare nuovi oggetti, si apre la possibilità di estendere un object senza conoscere alcun dettaglio. Naturalmente, potrebbe diventare uno svantaggio abbastanza rapidamente a seconda dell’utilizzo. Qui non faccio supposizioni sulla lingua, quindi è applicabile a lingue diverse da javascript che non sono così dinamiche.

myobject.prototype=unkownobject; myobject.newproperty=1; 

È ansible ottenere l’object da qualsiasi luogo; il proprio codice, dalla rete, dal database, dal collegamento esterno e così via.

Nota che, un linguaggio non deve implementare l’ereditarietà del prototipo come javascript. In javascript, un object prototipo è semplicemente condiviso, così come le sue proprietà, tra gli eredi. L’alternativa è copiare tutte le proprietà del prototipo nel nuovo object. Ogni approccio ha i suoi punti di forza in diverse situazioni. Mi piace il secondo di più, ma non è quello che fa javascript.

Dopo aver letto tutte le risposte questa è la conclusione

1) Ereditarietà in cui gli oggetti sono ereditati direttamente da altri oggetti

2) Questo non usa le classi

3) Chiamata anche programmazione basata su istanze o programmazione orientata al prototipo senza class

4) Il riutilizzo del comportamento viene eseguito clonando oggetti esistenti che fungono da prototipi

5) L’object usato come modello dal nuovo object ottiene le proprietà iniziali