Ciao, il problema sta sostanzialmente in questa riga:
codice:
this.piu.setAttribute('onclick',"this.aggiungispecifica()");
Cerco di spiegarti il problema e ti indico una soluzione.
In questo caso verrà creato, nel DOM, il div a cui attribuisci l'evento onclick, applicandolo come attributo al div stesso.
Il risultato HTML sarà una cosa del genere:
codice:
<div onclick="this.aggiungispecifica()" class="piu">+</div>
Ora la domanda è: "a cosa fa riferimento quell'istruzione this?"
Da come hai impostato la cosa, sembra che ti aspetti faccia riferimento al tuo oggetto tabella, ma non è così.
Dal momento che lo stai scrivendo direttamente nell'evento applicato come attributo sul div, il this farà riferimento esattamente a quell'elemento div del DOM, in cui, chiaramente, non sarà trovata alcuna funzione aggiungispecifica().
Puoi risolvere applicando l'evento onclick, non come attributo del DOM attraverso il metodo setAttribute(), ma direttamente con la sintassi JavaScript sull'oggetto che si riferisce a quel div, in questo modo:
codice:
this.piu.onclick = this.aggiungispecifica;
Fai attenzione però, in questo caso ci sarebbe un ulteriore problema. Questa riga è scritta (e quindi viene eseguita) prima della dichiarazione del metodo this.aggiungispecifica, che invece sta in fondo al tuo oggetto tabella. Questo significa che tale metodo non esiste nel momento in cui è eseguita l'assegnazione dell'evento, per cui si otterrà un errore. In questo caso basterebbe spostare in alto la dichiarazione di tale metodo.
Ad ogni modo ti consiglierei un diverso approccio. Ti spiego.
Lavorando con gli oggetti, in JavaScript, è possibile differenziare i membri di un oggetto, in "pubblici" (cioè accessibili anche dall'esterno) e "privati" (cioè visibili ed accessibili solo dall'interno dell'oggetto/costruttore stesso). In sostanza si usa il this per dichiarare i membri pubblici e l'istruzione var (o function) per dichiarare quelli privati. Per ora prendi per buono questo e, nel caso, fai qualche ricerca se ti serve approfondire su tale argomento.
Ora, dal momento che aggiungispecifica, da quello che mi sembra di capire, è un metodo privato (per cui non serve che sia accessibile dall'esterno), è sufficiente dichiararlo con function, in questo modo:
codice:
function aggiungispecifica(){
alert("ciao");
}
In tal caso, tale dichiarazione, potrà essere posta in qualsiasi punto (all'interno del costruttore tabella) sia alla fine che all'inizio, che sarà comunque vista da qualsiasi punto all'interno del costruttore stesso. In conclusione potrai applicare l'evento onclick in questo modo (senza il this prima del nome funzione):
codice:
this.piu.onclick = aggiungispecifica;
Chiaramente lo stesso discorso andrebbe applicato anche per rimuovispecifica.