2013-03-19 34 views
16

Więc ja projektując interfejs książkę klasy i mam przedmiotów zdefiniowana jako:JavaScript tworzenia nowej instancji obiektów

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

potem chcę utworzyć nową instancję:

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

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

I próbowałem również bez var z przodu, bez skutku. Dostaję "Uncaught TypeError: Object nie jest funkcją" Jestem bardzo nowy w javascript, więc nie wiem nawet, czy robię to w odpowiedni sposób. Jakakolwiek pomoc się przyda, dzięki.

+0

To jest JavaScript, a nie "skrypt Java". –

+1

Przeczytaj najpierw podstawowe informacje: https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Working_with_Objects. – VisioN

Odpowiedz

40

Twój kod istniejący:

// 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; 

Nie ma związku między zmiennymi i obiektu.

Wygląda jak chcesz coś bardziej jak:

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

Następnie:

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

Uwaga użycie dużej litery nazewnictwa funkcji konstruktora. Jest to konwencja w społeczności JS.

+0

W jaki sposób odniosę się do pól kursu utworzonych za pomocą funkcji? Chodzi o to, że chcę trzymać je jak instancję klasy w Javie. – user1991562

+0

'course1.name' etc – Quentin

+0

Dziękuję za wyjaśnienia! uratowałeś mnie. Straciłem kilka godzin próbując naprawić błąd, problem polegał na tym, że nie rozumiałem struktury oo javascript. –

32

JS jest prototypowy, a nie na podstawie klasy i jeśli jesteś nowy w nim istnieją zalety nauki to natychmiast zamiast próbować mush klasyczne modele dziedziczenia po nim, jednak klasyczny dziedziczenie jest żywy i dobrze w JS.

Tak czy inaczej, aby odpowiedzieć w jaki sposób uzyskać dostęp do zmiennych:

course1.name działa dobrze z powyższego przykładu.

Jeśli chciał sprywatyzować swoje dane, które mogłyby skorzystać z tej metody przy użyciu Zamknięcie:

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 ]; 
     } 
    } 
    } 
}; 

Następnie instancji nowego obiektu:

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

i zacząć używać wszystkie dane prywatne:

course.get('name');

Oczywiście, prawdopodobnie będziesz chciał, żeby setery także manipulowały danymi;)

+4

Mimo że obie odpowiedzi są poprawne, ta ma dla mnie więcej sensu niż akceptowana. – carbontwelve

Powiązane problemy