JavaScript è orientato agli oggetti?

Ci sono state alcune domande sul fatto che JavaScript sia o meno un linguaggio orientato agli oggetti. Anche una dichiarazione, “solo perché un linguaggio ha oggetti non lo rende OO”.

JavaScript è un linguaggio orientato agli oggetti?

IMO (ed è solo un’opinione) la caratteristica chiave di un linguaggio orientato agli oggetti sarebbe che supporterebbe il polimorfismo . Praticamente tutti i linguaggi dinamici lo fanno.

La prossima caratteristica sarebbe l’ incapsulamento e questo è abbastanza facile da fare anche in Javascript.

Tuttavia, nella mente di molti, è l’ ereditarietà (in particolare l’ereditarietà dell’implementazione) a suggerire l’equilibrio tra la qualifica di un linguaggio che si chiama object oriented.

Javascript fornisce un mezzo abbastanza semplice per ereditare l’implementazione tramite la prototipazione, ma questo è a scapito dell’incapsulamento.

Quindi se i tuoi criteri per l’orientamento degli oggetti sono il classico trio di polimorfismo, incapsulamento ed ereditarietà allora Javascript non passa.

Modifica : Viene sollevata la domanda complementare “In che modo l’eredità di sacrificio dell’ereditarietà prototipale?” Considera questo esempio di approccio non prototipale: –

function MyClass() { var _value = 1; this.getValue = function() { return _value; } } 

L’attributo _value è incapsulato, non può essere modificato direttamente dal codice esterno. Potremmo aggiungere un mutatore alla class per modificarlo in un modo interamente controllato dal codice che fa parte della class. Ora considera un approccio prototipo alla stessa class: –

 function MyClass() { var _value = 1; } MyClass.prototype.getValue = function() { return _value; } 

Bene, questo è rotto. Poiché la funzione assegnata a getValue non è più nell’ambito di _value, non può accedervi. Avremmo bisogno di promuovere _value su un attributo di this ma questo lo renderebbe accessibile al di fuori del controllo del codice scritto per la class, quindi l’incapsulamento è rotto.

Nonostante questo il mio voto rimane comunque che Javascript è orientato agli oggetti. Perché? Perché dato un OOD posso implementarlo in Javascript.

La risposta breve è Sì. Per maggiori informazioni:

Da Wikipedia :

JavaScript è fortemente basato sugli oggetti. Gli oggetti sono array associativi, potenziati con prototipi (vedi sotto). I nomi delle proprietà degli oggetti sono chiavi di array associativo: obj.x = 10 e obj [“x”] = 10 sono equivalenti, la notazione dei punti essendo semplicemente zucchero sintattico. Le proprietà e i relativi valori possono essere aggiunti, modificati o eliminati in fase di esecuzione. Le proprietà di un object possono anche essere enumerate tramite un ciclo for … in loop.

Inoltre, guarda questa serie di articoli su OOP con Javascript.

Javascript è un linguaggio multi-paradigma che supporta gli stili procedurali, orientati agli oggetti (basati su prototipi) e di programmazione funzionale.

Ecco un articolo che spiega come eseguire OO in Javascript.

Le lingue non hanno bisogno di comportarsi esattamente come Java per essere orientate agli oggetti. Tutto in Javascript è un object; confronta con C ++ o precedenti Java, che sono ampiamente considerati orientati agli oggetti in una certa misura ma ancora basati su primitive. Il polimorfismo è un non-problema in Javascript, in quanto non interessa affatto ai tipi. L’unica caratteristica OO principale non direttamente supportata dalla syntax è l’ereditarietà, ma può essere facilmente implementata, tuttavia il programmatore vuole utilizzare i prototipi: ecco un esempio.

Sì e no.

JavaScript è, come dice Douglas Crockford, ” il linguaggio di programmazione più incompreso al mondo “. Ha alcuni ottimi articoli su JavaScript che consiglio vivamente di leggere su cosa sia esattamente JavaScript. Ha più in comune con LISP che C ++.

JavaScript è orientato agli oggetti, ma non è un linguaggio orientato agli oggetti basato su classi come Java, C ++, C #, ecc. I linguaggi OOP basati su classi sono un sottoinsieme della più ampia famiglia di linguaggi OOP che includono anche linguaggi basati su prototipi come JavaScript e Sé.

JavaScript è un linguaggio di programmazione basato su prototipi (probabilmente il linguaggio di scripting basato su prototipi è una definizione più corretta). Utilizza la clonazione e non l’ereditarietà. Un linguaggio di programmazione basato su prototipi è uno stile di programmazione orientata agli oggetti senza classi. Mentre i linguaggi di programmazione orientati agli oggetti incoraggiano lo sviluppo focalizzato sulla tassonomia e le relazioni, i linguaggi di programmazione basati su prototipi incoraggiano a concentrarsi sul comportamento prima e poi sulla classificazione.

Il termine “orientato agli oggetti” fu coniato da Alan Kay nel 1967, che lo spiega nel 2003 a significare

solo messaggistica, conservazione locale e protezione e occultamento del processo statale, e estremo legame tardivo di tutte le cose. (fonte)

Nella programmazione orientata agli oggetti, ciascun object è in grado di ricevere messaggi, elaborare dati e inviare messaggi ad altri oggetti.

Perché un linguaggio sia orientato agli oggetti, può includere funzionalità come incapsulamento, modularità, polimorfismo ed ereditarietà, ma non è un requisito. I linguaggi di programmazione orientati agli oggetti che fanno uso di classi sono spesso definiti come linguaggi di programmazione basati su classi, ma non è assolutamente necessario utilizzare le classi per essere orientati agli oggetti.

JavaScript utilizza i prototipi per definire le proprietà dell’object, inclusi metodi ed ereditarietà.

Conclusione: JavaScript IS orientato agli oggetti.

A differenza della maggior parte dei linguaggi orientati agli oggetti, JavaScript (prima di ECMA 262 Edition 4, comunque) non ha alcun concetto di classi, ma di prototipi. In quanto tale, è in qualche modo soggettivo se chiamarlo orientato agli oggetti o no.

@eliben: Wikipedia dice basato sugli oggetti. Non è la stessa cosa di object-oriented. Infatti, il loro articolo sulle distinzioni basate sugli oggetti tra linguaggi orientati agli oggetti e quelli basati su prototipi, chiama esplicitamente JavaScript non orientato agli oggetti.

JavaScript è un ottimo linguaggio per scrivere applicazioni web orientate agli oggetti. Può supportare OOP perché supporta l’ereditarietà attraverso la prototipazione anche di proprietà e metodi. Puoi avere polimorfismo, incapsulamento e molti paradigmi di sottoclass.

Questa è ovviamente una domanda soggettiva e accademica. Alcune persone sostengono che un linguaggio OO deve implementare classi ed ereditarietà, altri scrivono programmi che ti cambiano la vita. 😉

(Ma in realtà, perché un linguaggio OO deve implementare le classi? Penso che gli oggetti siano i componenti chiave. Il modo in cui li crei e li utilizzi è un’altra questione.)

è un buon filo. Ecco alcune risorse che mi piacciono La maggior parte delle persone inizia con prototype, jquery o una delle prime 6 librerie (mootools, ExtJS, YUI), che hanno diversi modelli di oggetti. Il prototipo prova a replicare il classico OO come la maggior parte della gente pensa

http://jquery.com/blog/2006/08/20/why-jquerys-philosophy-is-better/

Ecco un’immagine di prototipi e funzioni a cui mi riferisco molto

http://www.mollypages.org/misc/js.mp ?

Sto rispondendo a questa domanda rimbalzata da un’altra angolazione.

Questo è un argomento eterno e potremmo aprire una guerra di fuoco in molti forum.

Quando le persone affermano che JavaScript è un linguaggio di programmazione OO perché possono usare OOD con questo, allora chiedo: perché non è un linguaggio di programmazione C an OO? Ripeti, puoi usare OOD con C e se hai detto che C è un linguaggio di programmazione OO, tutti ti diranno che sei pazzo.

Potremmo inserire qui molti riferimenti a questo argomento in libri e forum molto vecchi, perché questo argomento è più vecchio di Internet 🙂

JavaScript non è cambiato da molti anni, ma i nuovi programmatori vogliono mostrare che JavaScript è un linguaggio di programmazione OO. Perché? JavaScript è un linguaggio potente, ma non è un linguaggio di programmazione OO.

Un linguaggio di programmazione OO deve contenere oggetti, metodi, proprietà, classi, incapsulamento, aggregazione, ereditarietà e polimorfismo. Potresti implementare tutti questi punti, ma JavaScript non li ha.

Un esempio molto esplicativo: nel capitolo 6 di “JavaScript orientato agli oggetti” descriviamo 10 modi per implementare “ereditarietà”. Quanti modi ci sono in Java? Uno e in C ++? Uno, e in Delphi (Object Pascal)? Uno e in Objective-C? Uno.

Perché questo è diverso? Perché Java, C ++, Delphi e Objective-C sono progettati pensando a OOP, ma non a JavaScript.

Quando ero studente (nel 1993), all’università, c’era un tipico lavoro a casa: implementare un programma progettato usando un OOD (Object-oriented design) con un linguaggio non OO. A quei tempi, la lingua selezionata era C (non C ++). L’objective di queste pratiche era quello di chiarire la differenza tra OOD e OOP, e potrebbe differenziare tra i linguaggi OOP e non-OOP.

Comunque, è la prova che non tutte le persone hanno qualche opinione su questo argomento 🙂

Comunque, a mio parere, JavaScript è un linguaggio potente e il futuro nello strato laterale del client!

L’ episodio 146 di Hanselminutes riguarda OO Ajax. E ‘stato un bello spettacolo e sicuramente un bello spettacolo per aiutare a formare un’opinione.

Misko Hevery ha fatto un eccellente Google Tech Talk introduttivo in cui parla di oggetti in Javascript. Ho trovato che questo è un buon punto di partenza per le persone che mettono in discussione l’uso degli oggetti in Javascript, o che vogliono iniziare con loro:

  • Introduzione a JavaScript e Browser DOM

La libreria client Ajax di Microsoft semplifica l’implementazione di OO in javascript. Supporta l’inharitence e l’implementazione dell’interfaccia.

Penso che molte persone rispondano a questa domanda “no” perché JavaScript non implementa le classi, nel tradizionale senso OO. Sfortunatamente (IMHO), che sta arrivando in ECMAScript 4. Fino ad allora, viva la prototype! 🙂

Penso che quando si possono seguire schemi di progettazione identici o simili a quelli di un vero linguaggio OO come Java / C #, si può praticamente definire un linguaggio OO. Alcuni aspetti sono ovviamente diversi, ma è comunque ansible utilizzare schemi di progettazione OO molto ben consolidati.

JavaScript è Object-Based, non Object-Oriented. La differenza è che i linguaggi Object-Based non supportano l’ereditarietà corretta, mentre quelli orientati agli oggetti lo fanno.

Esiste un modo per ottenere l’ereditarietà “normale” in JavaScript (fare riferimento qui ), ma il modello di base si basa sulla prototipazione.

Tutto in javascript è un object: le classi sono oggetti, le funzioni sono oggetti, i numeri sono oggetti, oggetti oggetti oggetti. Non è così rigido nel digitare come in altri linguaggi, ma è sicuramente ansible scrivere OOP JS.

Javascript non è un linguaggio orientato agli oggetti come in genere considerato, principalmente a causa della mancanza di vera ereditarietà, la tipizzazione DUCK consente una forma semi-vera di ereditarietà / polimorfismo insieme al prototipo Object.protection che consente la condivisione di funzioni complesse. Nel suo cuore, tuttavia, la mancanza di ereditarietà porta a un polimorfismo debole perché la tipizzazione DUCK insisterà sul fatto che alcuni oggetti con lo stesso nome di attributo sono un’istanza di un Oggetto che non erano destinati ad essere usati come. Pertanto, l’aggiunta di attributi a oggetti casuali trasforma la base del loro tipo in un modo di parlare.

Tecnicamente è un linguaggio prototipo, ma è facile da usare in OO.

È orientato agli oggetti, ma non si basa su classi, si basa su prototipi.

Sì. Tuttavia, non supporta tutte le funzionalità che ci si aspetterebbe da un linguaggio di programmazione orientato agli oggetti privo di ereditarietà e polimorfismo. Ciò non significa, tuttavia, che non è ansible simulare queste capacità attraverso il sistema di prototipazione che è disponibile per il linguaggio.

Gli oggetti in JavaScript ereditano direttamente dagli oggetti. Cosa può essere più orientato agli oggetti?

Per me personalmente, l’attrazione principale della programmazione OOP è la capacità di avere classi autonome con meccanismi interni non privati ​​(privati).

Ciò che mi confonde in Java è che non puoi neanche usare nomi di funzioni, perché corri il rischio di avere lo stesso nome di funzione da qualche altra parte in una qualsiasi delle librerie esterne che stai usando.

Anche se alcune persone molto intelligenti hanno trovato soluzioni alternative per questo, non è strano che Javascript nella sua forma più pura richieda la creazione di codice altamente illeggibile?

La bellezza di OOP è che puoi passare il tuo tempo a pensare alla logica della tua app, senza doversi preoccupare della syntax.

JavaScript è orientato agli oggetti?

Risposta: sì

Ha oggetti che possono contenere dati e metodi che agiscono su tali dati. Gli oggetti possono contenere altri oggetti.

  • Non ha classi, ma ha costruttori che fanno ciò che fanno le classi, incluso agire come contenitori per variabili e metodi di class.
  • Non ha un’eredità orientata alla class, ma ha un’eredità orientata al prototipo.

I due modi principali di build sistemi di oggetti sono per ereditarietà (is-a) e per aggregazione (has-a). JavaScript fa entrambi, ma la sua natura dynamic gli consente di eccellere nell’aggregazione.

Alcuni sostengono che JavaScript non sia veramente orientato agli oggetti perché non fornisce informazioni nascoste. Cioè, gli oggetti non possono avere variabili private e metodi privati: tutti i membri sono pubblici.

Ma risulta che gli oggetti JavaScript possono avere variabili private e metodi privati. (Clicca qui ora per scoprire come.) Certo, pochi lo capiscono perché JavaScript è il linguaggio di programmazione più incompreso al mondo.

Alcuni sostengono che JavaScript non è veramente orientato agli oggetti perché non fornisce ereditarietà. Ma si scopre che JavaScript supporta non solo l’ereditarietà classica, ma anche altri schemi di riutilizzo del codice.

Fonti: http://javascript.crockford.com/javascript.html

Direi che ha capacità di sembrare OO. Soprattutto se si sfrutta la sua capacità di creare metodi su un object esistente (metodi anonimi in alcune lingue). Le librerie di script client come jquery (jquery.com) o prototype (prototypejs.org) sono buoni esempi di librerie che si avvalgono di questo, rendendo il javascript molto simile a OO.