Mam pewne problemy z JavaScript. Mam następujący kod:JavaScript: Dodawanie odziedziczonej klasy do tablicy nie działa
<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 dziedziczy z klasy sterowania.
Funkcja addControl w klasie Form właśnie dodaje kontrolkę do tablicy.
Problem polega na tym, że gdy dodaję więcej niż jeden SpecializedControl, wartości w tablicy są nieco przesłonięte, co oznacza, że kiedy uzyskuję dostęp do pierwszego elementu w tablicy, który powinien być "Control1", otrzymuję "Control2" . Control1 nie jest już w tablicy.
Kiedy używam tej samej funkcji z obiektami sterowania jako parametrami, wszystko działa zgodnie z oczekiwaniami.
Czy ktoś wie, dlaczego tak się dzieje i co można zrobić, żeby to poprawić?
polecam drugą opcję, wywołanie konstruktora nadklasy w konstruktorze podklasy. Wydaje się, że to słuszne. Pierwsza opcja wymaga ujawnienia zmiennej 'name', a trzecia opcja używa dodatkowej biblioteki, która stara się zaimplementować zwykłe dziedziczenie klasowe jako zamiennik prototypowego dziedziczenia JavaScript. –
joi używa prototypowego dziedziczenia, a nie dziedziczenia klasycznego. –
Och, moje złe. Mimo to '# name' jest tylko wewnętrzną konwencją i tak naprawdę nie uniemożliwia dostępu do niego z zewnątrz. Przy zamknięciach możesz mieć naprawdę prywatne zmienne. –