Ho alcuni problemi con JavaScript. Ho il seguente codice:JavaScript: l'aggiunta di una classe ereditata all'array non funziona
<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>
Il controllo Specialized eredita dalla classe Control.
La funzione addControl nella classe Form aggiunge semplicemente il controllo a un array.
Il problema è che quando aggiungo più di uno SpecializedControl, i valori nell'array sono sovrascritti, ciò significa che quando accedo al primo elemento dell'array, che dovrebbe essere "Control1", ottengo "Control2" . Control1 non è più nell'array.
Quando utilizzo la stessa funzione con oggetti Control come parametri, tutto funziona come previsto.
Qualcuno sa perché questo accade e cosa si può fare per correggere questo?
vi consiglio la seconda opzione, chiamando il costruttore della superclasse nel costruttore della sottoclasse. Sembra la cosa giusta da fare. La prima opzione richiede di esporre la variabile 'name' e la terza opzione utilizza una libreria aggiuntiva che tenta di implementare un'eredità regolare basata sulla classe come sostituzione dell'eredità prototipica di JavaScript. –
joi utilizza l'ereditarietà prototipica, non l'ereditarietà classica –
Oh, mio male. Tuttavia, il '# nome' è solo per convenzione e in realtà non ti impedisce di accedervi dall'esterno. Con chiusure, puoi avere variabili veramente private. –