2013-03-19 11 views
16

Quindi io sono la progettazione di un'interfaccia di grado libro e ho un corso definito come:JavaScript creando nuova istanza di oggetti

<script> 
course = new Object(); 
var name; 
var gradingareas; 
var finalgrade; 
</script> 

poi voglio creare una nuova istanza:

var gradingareas = new Array("Homework", "Classwork", "Exams"); 

course1 = new course("CS1500", gradingareas, 85); 

I ho anche provato senza il var di fronte inutilmente. Ottengo un "Uncaught TypeError: Object is not a function" Sono molto nuovo in javascript quindi non so nemmeno se sto andando su questo nel modo corretto. Qualsiasi aiuto è apprezzato Grazie.

+0

È JavaScript, non "script Java". –

+1

Leggere prima le basi qui: https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Working_with_Objects. – VisioN

risposta

40

il codice esistente:

// Creates a new, empty object, as a global 
course = new Object(); 
// Creates three new variables in the global scope. 
var name; 
var gradingareas; 
var finalgrade; 

v'è alcun collegamento tra le variabili e l'oggetto.

Sembra che si desidera qualcosa di più simile a:

function Course(name, gradingareas, finalgrade) { 
    this.name = name; 
    this.gradingareas = gradingareas; 
    this.finalgrade = finalgrade; 
} 

Poi:

var course1 = new Course("CS1500", gradingareas, 85); 

Nota l'uso di una lettera maiuscola per la denominazione della funzione di costruzione. Questa è una convenzione nella comunità JS.

+0

Quindi come faccio a fare riferimento ai campi del corso creati con la funzione? L'idea è che voglio trattenerli come un'istanza di una classe in java. – user1991562

+0

'course1.name' etc – Quentin

+0

Grazie per la spiegazione! mi hai salvato. Ho perso un paio d'ore cercando di correggere un bug, il problema era che non capivo la struttura oo di javascript. –

32

JS è un prototipo piuttosto che basato su classi e, se si è principianti, ci sono dei vantaggi nell'apprenderlo immediatamente piuttosto che cercare di riprodurre modelli di ereditarietà classica, tuttavia l'ereditarietà classica è viva e vegeta in JS.

In ogni caso, per rispondere a come si dovrebbe accedere alle variabili:

course1.name funziona bene con l'esempio precedente.

Se si voleva privatizzare i dati si potrebbe prendere questo approccio utilizza chiusura:

var Course = function(name, grade) { 
    // Private data 
    var private = { 
    name: name, 
    grade: grade 
    } 

    // Expose public API 
    return { 
    get: function(prop) { 
     if (private.hasOwnProperty(prop)) { 
     return private[ prop ]; 
     } 
    } 
    } 
}; 

Poi un'istanza di un nuovo oggetto:

var course = new Course('Programming with JavaScript', 'A');

e iniziare a utilizzare tutti i dati privati:

course.get('name');

Certo, probabilmente vorrai che i setter manipolino anche questi dati;)

+4

Anche se entrambe le risposte sono corrette, questo ha più senso per me della risposta accettata. – carbontwelve

Problemi correlati