У меня возникают некоторые проблемы с JavaScript. У меня есть следующий код:JavaScript: добавление унаследованного класса в массив не работает
<html>
<head>
<title>Test</title>
<script type="text/javascript">
function Control(){
var name;
this.setName = function(newName){
name = newName;
};
this.getName = function(){
return name;
};
}
function SpecializedControl(){
}
SpecializedControl.prototype = new Control();
function Form(){
var formControls = [];
this.addControl = function(control){
formControls.push(control);
alert(formControls[0].getName());
};
}
var form = new Form();
var control1 = new SpecializedControl();
control1.setName("Control1");
form.addControl(control1);
var control2 = new SpecializedControl();
control2.setName("Control2");
form.addControl(control2);
</script>
</head>
<body>
</body>
</html>
SpecializedControl наследует класс Control.
Функция addControl в классе Form просто добавляет элемент управления в массив.
Проблема заключается в том, что когда я добавляю несколько специализированных контроллеров, значения в массиве являются чрезмерными, это означает, что когда я получаю доступ к первому элементу массива, который должен быть «Control1», я получаю «Control2», , Control1 больше не находится в массиве.
Когда я использую ту же функцию с объектами управления как параметры, все работает так, как ожидалось.
Кто-нибудь знает, почему это происходит и что можно сделать, чтобы исправить это?
Я рекомендую второй вариант, вызов конструктора суперкласса в конструкторе подкласса. Кажется, это правильно. Первый вариант требует раскрытия переменной 'name', а третий вариант использует дополнительную библиотеку, которая пытается реализовать обычное наследование на основе классов в качестве замены прототипического наследования JavaScript. –
joi использует прототипное наследование, а не классическое наследование –
О, мой плохой. Тем не менее, '# name' является только внутренним по соглашению и фактически не мешает вам получать доступ к нему извне. С закрытием вы можете иметь действительно частные переменные. –