2010-01-31 10 views
6

quali sono la differenza tra questi due modi di creare una classe:differenza tra questi 2 modi per creare una classe in javascript

var apple = { 
    type: "macintosh", 
    color: "red", 
    getInfo: function() { 
     return this.color + ' ' + this.type + ' apple'; 
    } 
} 

function Apple (type) { 
    this.type = type; 
    this.color = "red"; 
    this.getInfo = function() { 
     return this.color + ' ' + this.type + ' apple'; 
    }; 
} 

e come si fa a istanze e utilizzare i membri?

+0

Si sta creando solo un oggetto e non una classe. – Gumbo

risposta

6

Mentre JavaScript è un linguaggio orientato agli oggetti, non utilizza le classi. Non si crea una "classe" in JavaScript. Crei un "prototipo". JavaScript è considerato un Prototype-based language.

Il primo esempio è noto come "object-literal notation" per la creazione di un oggetto (un sottoinsieme del quale è popolarmente noto come JSON). Un'analogia di questo nei linguaggi basati su classi è una classe "statica", nel senso che non è necessario creare una nuova istanza di un oggetto in questo caso; "Esiste", una volta definito. Non lo avresti istanziato, avresti accesso ai membri di apple immediatamente poiché lo apple è già un oggetto. È anche simile alla creazione di una classe anonima in Java. Usereste in questo modo:

alert(apple.getInfo()); 

Con il secondo esempio, si sta creando un prototipo (non una classe), che può essere utilizzata per creare un'istanza di oggetti di tipo Apple. Si potrebbe utilizzare in questo modo:

var redDelicious = new Apple("Red Delicious"); 
alert(redDelicious.getInfo()); 

JavaScript consente di modificare e aggiungere con il prototipo di un oggetto, in modo da dopo aver dichiarato la vostra Apple prototipo, si potrebbe ancora continuare ad aggiungere o cambiare le cose su di esso in questo modo:

Apple.prototype.size = "7cm"; 

Quando si esegue questa operazione, tutti gli oggetti derivati ​​dal prototipo Apple otterranno un campo size. Questa è la base su come lo PrototypeJS framework lavora per modificare gli oggetti JavaScript nativi per aggiungere la funzionalità di correzione &.

Tenere presente che è considerata una cattiva prassi modificare il prototipo di oggetti JavaScript nativi, quindi è consigliabile evitare di farlo quando possibile.

+0

Il primo esempio non è una classe statica. È un oggetto JS creato usando la sintassi letterale dell'oggetto. – SolutionYogi

+0

@SolutionYogi So che non è una classe statica; la prima cosa che ho menzionato nella mia risposta è che non ci sono classi in JavaScript. Tuttavia, è più semplice spiegare la sintassi basata su prototipo di JavaScript utilizzando analogie a cui le persone hanno già familiarità se hanno programmato una lingua che utilizza le classi. –

+0

Continuo a pensare che chiamarlo "classe statica" sia completamente sbagliato. La classe statica non può avere stato. Lo metterei in questo modo: nel tradizionale lembo OOP, non puoi creare un oggetto senza classe ma in JavaScript, puoi farlo. E questo è ciò che l'utente ha fatto nel primo esempio. – SolutionYogi

3

Il tuo primo approccio è JavaScript Object Literal e si può accedere:

apple.type; // returns "macintosh" 
apple.getInfo(); // prints "red macintosh apple" 

È inoltre possibile aggiungere le proprie proprietà come wasGood o price in questo modo:

apple.wasGood = "true"; 
apple.price = "0.50"; 
alert(apple.price); // alerts "0.50" 

tuo secondo approccio è un'istanza di un oggetto a cui si può accedere da:

var myApple = new Apple("macintosh"); 
myApple.type; // returns "macintosh" 
myApple.getInfo(); // returns "red macintosh apple" 

Aggiunta di proprietà per l'oggetto di Apple è necessario utilizzare la parola chiave prototype:

Apple.prototype.price = "0.50"; 
Apple.prototype.wasGood = "true"; 
alert(myApple.price); // alerts "0.50" 
3

Qui sono alcune differenze:

  • Il primo modo è incompleta, c'è un punto e virgola mancante dopo l'ultima parentesi chiusa .

  • Il primo modo crea un oggetto, mentre il secondo solo un costruttore che può essere utilizzato per creare oggetti.

  • Il primo modo può creare solo un singolo oggetto, mentre il secondo modo può essere utilizzato dalla parola chiave new per creare più oggetti.

  • Il primo modo non può assumere alcun parametro che influenzi il modo in cui l'oggetto viene inizializzato, mentre il secondo può.

Il primo modo crea un singolo oggetto e assegna alla variabile apple, che può essere utilizzato per accedere ai membri:

alert(apple.type); 

Il secondo modo in cui viene utilizzata la parola new per creare le istanze:

var green = new Apple('Signe Tillisch'); 
alert(green.type); 
Problemi correlati