JavaScript, создающий новый экземпляр объектов
Итак, я разрабатываю интерфейс класса книги, и у меня есть курс, определяемый как:
<script>
course = new Object();
var name;
var gradingareas;
var finalgrade;
</script>
то позже я хочу создать новый экземпляр:
var gradingareas = new Array("Homework", "Classwork", "Exams");
course1 = new course("CS1500", gradingareas, 85);
Я тоже пробовал без var перед безрезультатно. Я получаю "Uncaught TypeError: Object не является функцией". Я очень новичок в javascript, поэтому я даже не знаю, правильно ли я это сделаю. Любая помощь приветствуется. Спасибо.
Ответы
Ответ 1
Существующий код:
// 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;
Связь между переменными и объектом отсутствует.
Похоже, вы хотите что-то большее:
function Course(name, gradingareas, finalgrade) {
this.name = name;
this.gradingareas = gradingareas;
this.finalgrade = finalgrade;
}
Тогда:
var course1 = new Course("CS1500", gradingareas, 85);
Обратите внимание на использование заглавной буквы для именования функции-конструктора. Это соглашение в сообществе JS.
Ответ 2
JS является прототипом, а не основанной на классе, и если вы новичок в этом, есть преимущества в том, чтобы сразу это изучить, а не пытаться сбрасывать с него классические модели наследования, однако классическое наследование живое и хорошее в JS.
Во всяком случае, чтобы ответить, как вы получите доступ к своим переменным:
course1.name
отлично работает с приведенным выше примером.
Если вы хотите приватизировать свои данные, вы можете использовать этот подход, используя закрытие:
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 ];
}
}
}
};
Затем создайте новый объект:
var course = new Course('Programming with JavaScript', 'A');
и начните использовать все эти личные данные:
course.get('name');
Конечно, вы, вероятно, захотите, чтобы сеттеры тоже манипулировали этими данными;)