Newsgroup: it.comp.lang.javascript
Titolo: ridefinire funzioni interne

Non sapevo che in Javascript fosse possibile ridefinire, 
sovrascrivendole, le funzioni interne (builtin function).
Per esempio (da
http://stackoverflow.com/questions/5409428/how-to-override-a-javascript-function
), 
se scrivo
 
parseFloat = function(a){alert(a)};
 
eseguendo parseFloat(3) verrà visualizzato il messaggio 3.
 
Ora io sto scrivendo un bookmarklet (quindi del codice javascript 
richiamabile dai segnalibri e destinato a girare su pagine diverse 
ciascuna con il suo proprio codice js; cioè, in altre parole, devo far 
convivere il mio codice con altro già esistente sul quale non ho 
controllo) e devo eseguire un'operazione "critica" che apre una nuova 
pagina tramite la riga
 
window.location(www.miodominio.invalid);
 
Vorrei sapere se questo comando può venire "intercettato" tramite una 
ridefinizione di window.location analoga a quella sopra per parseFloat 
che permetta, per esempio, di aprire la pagina 
www.tistotruffando.invalid anziché www.miodominio.invalid. Lasciamo 
perdere al momento se una tale manipolazione ha senso o meno. Io chiedo 
essenzialmente se è possibile. Se esiste, cioè, del codice simile a 
questo sotto, ovviamente del tutto inventato e non funzionante (non sono 
in grado di scriverlo meglio):
 
var window.location = function(){return "www.tistotruffando.invalid"};
 
Se non sbaglio, location è una proprietà dell'oggetto window. L'esempio 
iniziale riguardava una funzione builtin, e non so se in JavaScript sia 
possibile ridefinire anche proprietà di oggetti builtin. Forse la mia 
domanda è puramente accademica. Al momento solo io uso il bookmarklet, e 
nessuno ha l'interesse a considerarne l'esistenza. Però mi sto ponendo, 
velleitariamente, il problema di uno scenario dove tale bookmarklet 
potrebbe avere tanti utenti. Chiaramente la possibilità di 
"intercettare" l'istruzione che richiama una nuova pagina indirizzando 
il browser su una pagina diversa da quella attesa, predisposta per 
ingannare gli utenti, invaliderebbe tutto il mio lavoro in termini di 
sicurezza e non ci investirei sopra altro tempo.
 
Ricapitolando, la mia domanda è: è possibile ridefinire la proprietà 
location dell'oggetto window e fare così in modo che si possa sostituire 
l'url di una nuova pagina?
Spero di non essermi spiegato in modo troppo contorto.

> window.location(www.miodominio.invalid);
 
Scusate, volevo ovviamente scrivere 
window.location="www.miodominio.invalid";
e poi forse location è un oggetto (con una proprietà predefinita) invece 
che una proprietà.
Comunque la sostanza della mia richiesta non cambia.

 l'url di una nuova pagina?
 
Risposta: generalmente no, può dipendere dal browser.

 Risposta: generalmente no, può dipendere dal browser.
 
Grazie mille per la spiegazione. C'è qualche specie di "manifesto" che 
mi dice se un browser segue gli standard o è meglio provare in quello 
che mi interessa a eseguire il codice seguente che hai suggerito?
 
     var desc = Object.getOwnPropertyDescriptor(window, "location");
     alert(desc.configurable);

 che mi interessa a eseguire il codice seguente che hai suggerito?
 
Direi la seconda. Considera che i metodi che ti ho mostrato sono ES5
only, quindi i browser che non li supportano (IE, o vecchie versioni di
altri browser) ti darebbero errore. Ciò non toglie che anche su tali
browser `location` potrebbe non essere configurabile, solo che non c'è
modo di verificarlo usando quei metodi. È anche vero che senza ES5
difficilmente puoi sovrascrivere una proprietà usando un getter /
setter. Magari potresti fare un check nel caso il browser supporti
`__defineSetter__`
(
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/DefineSetter
).
 
Il mio suggerimento quindi sarebbe fare una cosa del genere:
 
- Se il browser supporta ES5 (quindi il browser ha
`Object.getOwnPropertyDescriptor`) usare quello su `location` e leggere
se è configurabile
 
- Altrimenti, verificare se ha __defineGetter__, e in tal caso tentare
di usarlo per sovrascrivere `location`: se ti rilancia un eccezione (che
puoi trappare con try / catch) e l'oggetto `location` ancora punta alla
reference precedente, puoi ragionevolmente assumere che non è possibile
sovrascriverlo. Altrimenti puoi notificare l'utente che sta usando un
browser non sicuro.
 
- Rimarrebbe aperta la questione VBScript sulle versioni di IE, ma lì
non ci metto (non ci voglio mettere) bocca. Dubito comunque tu possa
associare un setter a un oggetto già esistente.