Newsgroup: it.comp.lang.javascript
Titolo: vecchio script

Un quesito su un vecchio script....lo vedete a pagina 267 di questo libro.
 
Non ho capito cosa sarebbe e come funziona questo oggetto buttonset,secondo 
me il codice è sbagliato o è incompleto.
 
Potete dare un occhiata?
 
http://books.google.it/books?id=i5EE76dwR-UC&pg=RA1-PA267&lpg=RA1-PA267&dq=buttonset+javascript+this.addbtn&source=bl&ots=yX1pGYnSON&sig=M_wzwQ3nOAVXlInRhPl_sfD5Go0&hl=it#v=onepage&q=buttonset%20javascript%20this.addbtn&f=false
 
 
Grazie e saluti 
 
 


A me, così ad occhio, sembra poter funzionare.
Ma usa vecchie cose, dal riconoscimento dei browser tramite navigator 
(non usato oramai da un decennio), al document.write (che personalmente 
non ho mai avuto bisogno di usare), ma soprattutto all'uso sconsiderato 
di eval. 
 
Usa il sito 
mozilla.org
 per capire come si costruisce un oggetto e 
dimenticati questo esempio, IMHO.

 me il codice è sbagliato o è incompleto.
 
È incompleto. Mi par di capire che l'hanno mostrato come esempio di
creazione di "oggetti complessi", ma non come esempio funzionante. Una
sorta di anticipazione. Se cerchi all'interno del libro vedrai come poi
viene utilizzato successivamente (almeno, una breve ricerca di
`buttonSet` mi ha portato risultati a pagine successive).
 
Il primo chiaro segno di "incompletezza" è dato dalla funzione `addBtn`
che non appare nel listato.
 
Inoltre è decisamente sbagliato. Al di là delle tecniche giustamente
antiche comparate al giorno d'oggi, ci sono chiari errori di concetto
che mi fanno pensare che, almeno al tempo, gli autori non fossero degli
esperti del linguaggio. Un esempio: dichiarare funzioni globali (print,
addBtn) da poi associare dinamicamente agli oggetti: se uno script
qualsiasi dovesse sovrascrivere queste funzioni, una successiva
creazione di un oggetto `buttonSet` avrebbe i metodi che puntano a
funzioni diverse rispetto alle istanze create precedentemente.
 
Non solo, `print` è definito nello scope globale e come tale diventa un
metodo di `window`. Ma `window.print` già esiste, e serve a invocare la
funzione di stampa sulla pagina corrente. Ergo, ridefinendo tale
funzione, si va a "sovrascrivere" quella esistente, inibendo per la
pagina che utilizza tale script la capacità di stampare la pagina su
stampante.
 
Ma non è l'unica cosa, si potrebbe continuare. Oltre il pericoloso uso
di `eval`, come già è stato fatto notare, non è chiaro il motivo di avere:
 
	spaceInt = 0 + this[i].spacer;
 
Perché aggiungere 0? Mi viene da sospettare che, come ho detto prima,
gli autori al tempo non conoscessero bene il linguaggio e venissero da
altri linguaggi, quindi che usando una cosa cosa del genere pensassero
di forzare la proprietà `spacer` a diventare intera, mentre invece se è
float rimane float, se è stringa rimane stringa.
 
In sostanza, seguire questi esempi è pericoloso perché può portarti a
false conclusioni, e se c'è qualcosa di peggio dell'ignorare, è
apprendere insegnamenti sbagliati.

 Perché aggiungere 0?
 
se spacer fosse una stringa,in tal modo la somma è un numero anzichè una 
stringa,questo perchè concatenare un numero a una stringa da come risultato 
un numero.
 
esempio:
 
0+"5" =  5    e  non  "5"
 
3+"5" = 8    e non  "35"
 
Non so se vale ancora questa regola dell'operatore concatenazione,regola che 
ho appreso sul libro,che ho capito adesso essere comunque obsoleto.
 
Grazie e ciao
 
 
 

 ho appreso sul libro,che ho capito adesso essere comunque obsoleto.
 
Non è solo obsoleto, quanto errato. Come ho detto nel mio precedente
post, da l'impressione che sia stato scritto da persone che non fossero
esperti del linguaggio, ma venissero da esperienze di programmazione con
linguaggi differenti, e si fossero appena affacciati a JavaScript.