Il linguaggio JavaScript
 

oggetto.nomeFunzione("stringa").operaSullaFunzione()

alcaseltzer 23 Gen 2016 22:17
Ciao a tutti,
sto cercando di mettere ordine a tanti piccoli script che nel tempo mi sono
creato per lavorare più comodamente con Javascript.

Ora avrei bisogno di concatenare alcune funzioni per operare in maniera
gerarchica. Volevo fare qualcosa tipo:

mioOggetto.stringa(" testo della stringa ").operaSullaStringa();

in pratica, la mia funzione stringa() dovrebbe restituire qualcosa su cui la mia
funzione operaSullaStringa() poi possa lavorare. Non sono riuscito a metterlo in
pratica. Ho visto che jQuery riesce a fare cose simili, tipo
$("qlcs").faiQlcsAltro(); ma non ho capito come faccia (dato che non estende il
DOM).

Ho diverse piccole funzioni che operano sulle stringhe e volevo radunarle così,
senza estendere a mia volta il DOM, evitando di usare quindi
String.prototype.faiQlcsAltro().

Grazie a chiunque voglia cimentarsi.
Alessandro Pellizzari 24 Gen 2016 07:59
Il Sat, 23 Jan 2016 13:17:34 -0800, alcaseltzer ha scritto:

> Ora avrei bisogno di concatenare alcune funzioni per operare in maniera
> gerarchica. Volevo fare qualcosa tipo:
>
> mioOggetto.stringa(" testo della stringa ").operaSullaStringa();
> ...
> Ho diverse piccole funzioni che operano sulle stringhe e volevo
> radunarle così, senza estendere a mia volta il DOM, evitando di usare
> quindi String.prototype.faiQlcsAltro().

Quella è la sintassi per chiamare un metodo di un oggetto, quindi la puoi
applicare solo su oggetti.

Se non vuoi estendere l'oggetto String (che non è DOM, ma normale JS), e
in generale fai bene, allora devi crearti un tuo oggetto string e usare
sempre quello.

Bye.
albaserver@gmail.com 24 Gen 2016 11:06
Il giorno domenica 24 gennaio 2016 07:59:07 UTC+1, Alessandro Pellizzari ha
scritto:
> Quella è la sintassi per chiamare un metodo di un oggetto, quindi la puoi
> applicare solo su oggetti.

Quindi dovrei fare qualcosa tipo:

var stringa=
{
operaSullaStringa: function(parametro)
{
parametro.faiQlcs();
}
}

Così dovrei richiamarlo come stringa.operaSullaStringa("valore")?

> Se non vuoi estendere l'oggetto String (che non è DOM, ma normale JS), e
> in generale fai bene, allora devi crearti un tuo oggetto string e usare
> sempre quello.

Sì scusa mi sono accorto dopo dell'errore.

Ma, a scopo didattico, come fa jQuery ad estendere le funzioni e a operare su
$("qualcosa").lavoraSulReturnDellaFunzione()?

Grazie e ciao
albaserver@gmail.com 24 Gen 2016 11:26
Il giorno domenica 24 gennaio 2016 11:06:18 UTC+1, albas...@gmail.com ha
scritto:
> Ma, a scopo didattico, come fa jQuery ad estendere le funzioni e a operare su
$("qualcosa").lavoraSulReturnDellaFunzione()?

Alessandro ho capito quello che volevi dirmi. La funzione deve restituire un
oggetto che avrà una proprietà lavoraSulReturnDellaFunzione che sarà una
function che opera sui parametri passati alla funzione.

Per chi fosse interessato e per spirito di condivisione, qualcosa tipo:

mioOggetto.funzione=function(parametri)
{
return {
faiQualcosa: function()
{
// lavora sulla var "parametri" passati a funzione
}
}
};

Grazie e a buon rendere!
Alessandro Pellizzari 24 Gen 2016 14:33
Il Sun, 24 Jan 2016 02:06:17 -0800, albaserver ha scritto:

> Ma, a scopo didattico, come fa jQuery ad estendere le funzioni e a
> operare su $("qualcosa").lavoraSulReturnDellaFunzione()?

jQuery ritorna quasi sempre un "oggetto jQuery" che wrappa altre cose,
tipicamente un array di elementi del DOM.

Prova a fare

<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script>
console.log($('li'));
</script>

e vedi cosa ti stampa nella console. :)

Bye.
albaserver@gmail.com 24 Gen 2016 14:48
Il giorno domenica 24 gennaio 2016 14:33:50 UTC+1, Alessandro Pellizzari ha
scritto:
> jQuery ritorna quasi sempre un "oggetto jQuery" che wrappa altre cose,
> tipicamente un array di elementi del DOM.

n.fn.init[3]

un array init dell'oggetto fn, proprietà dell'oggetto n. Al quale sono
associate tutte le proprietà tipiche di jQuery che contengono delle funzioni
per operarci (css, animate ecc.).

Ma nel source code di jQuery non ho capito come creano questo oggetto.
4ndre4 24 Gen 2016 14:56
On 23/01/2016 21:17, alcaseltzer wrote:

> Ora avrei bisogno di concatenare alcune funzioni per operare in maniera
gerarchica.

Cioe` vuoi creare qualcosa di "chainable" simile al seguente?

function YourObject() {
this.yourText = "hello";
};

YourObject.prototype.doSomething = function() {
this.yourText += ", I've done something";
return this;
};

YourObject.prototype.doSomethingElse = function() {
this.yourText += ", I've done something else";
return this;
};

YourObject.prototype.getText = function() {
return this.yourText;
};

var yourObject = new YourObject();
console.log(yourObject.getText());
yourObject.doSomething().doSomethingElse().doSomething().doSomethingElse();
console.log(yourObject.getText());

--
4ndr4
"The use of COBOL cripples the mind; its teaching should, therefore, be
regarded as a criminal offense." (E. Dijkstra)
"Ora, questo "Delta11" non è nulla di più di uno scemo del
villaggio[...]" - http://goo.gl/1nrkkX
Alessandro Pellizzari 24 Gen 2016 15:14
Il Sun, 24 Jan 2016 05:48:21 -0800, albaserver ha scritto:

> Il giorno domenica 24 gennaio 2016 14:33:50 UTC+1, Alessandro Pellizzari
> ha scritto:
>> jQuery ritorna quasi sempre un "oggetto jQuery" che wrappa altre cose,
>> tipicamente un array di elementi del DOM.
>
> n.fn.init[3]
>
> un array init dell'oggetto fn, proprietà dell'oggetto n. Al quale sono
> associate tutte le proprietà tipiche di jQuery che contengono delle
> funzioni per operarci (css, animate ecc.).
>
> Ma nel source code di jQuery non ho capito come creano questo oggetto.

Qualcosa del genere:

var MyString = function(val) {
this.val = val;
}

MyString.prototype.append = function(v2) {
return new MyString(this.v + v2);
}

In questo modo wrappi sempre il risultato nell'oggetto stesso, e puoi fare

var pippo = (new MyString('p')).append('ip').append('po');
console.log(pippo.val);

(Codice non testato. "Fai come dico, non come faccio" :) )

Poi jQuery usa un trucchetto b*****e per evitare il new, qualcosa tipo

var MyString = function(val) {
if (this == document) {
return new MyString(val);
} else {
this.val = val;
}
}

Per cui puoi fare

var pippo = MyString('p').append('ip').append('po');

(vedi disclaimer sopra)

Bye.
albaserver@gmail.com 24 Gen 2016 15:28
Il giorno domenica 24 gennaio 2016 15:14:04 UTC+1, Alessandro Pellizzari ha
scritto:
>[...]
> Per cui puoi fare
>
> var pippo = MyString('p').append('ip').append('po');
>
> (vedi disclaimer sopra)

Scusa ma non ho capito :(

Ho provato a fare:

var MyString = function(val) {
if (this == document) {
return new MyString(val);
} else {
this.val = val;
}
}

MyString.prototype.append = function(v2) {
return MyString(this.val + v2);
}


var pippo = MyString('p').append('ip').append('po');
console.log(pippo);

Ma mi restituisce:

Uncaught TypeError: Cannot read property 'append' of undefined
4ndre4 24 Gen 2016 15:52
On 24/01/2016 14:28, albaserver@gmail.com wrote:
[...]
> Ma mi restituisce:
>
> Uncaught TypeError: Cannot read property 'append' of undefined

Perche`, nella tua funzione, sta seguendo il ramo else e restituendo una
semplice stringa, non un MyString.


--
4ndr4
"The use of COBOL cripples the mind; its teaching should, therefore, be
regarded as a criminal offense." (E. Dijkstra)
"Ora, questo "Delta11" non è nulla di più di uno scemo del
villaggio[...]" - http://goo.gl/1nrkkX
Alessandro Pellizzari 24 Gen 2016 16:50
Il Sun, 24 Jan 2016 06:28:04 -0800, albaserver ha scritto:

> Scusa ma non ho capito :(

Ti ho avvisato che era meta-codice non testato! :D

> Ho provato a fare:
>
> var MyString = function(val) {
> if (this == document) {

Non mi ricordo mai cosa va qui. Forse window al posto di document.
In pratica serve a dire "se l'utente non ha usato new".
Naturalmente window non funziona in node.js.
Dovrebbe esserci il pattern da qualche parte su Internet. :)

Bye.
albaserver@gmail.com 24 Gen 2016 19:45
Il giorno domenica 24 gennaio 2016 16:50:25 UTC+1, Alessandro Pellizzari ha
scritto:
> Non mi ricordo mai cosa va qui. Forse window al posto di document.
> In pratica serve a dire "se l'utente non ha usato new".

Ah vero, ovvio è window. Inizio a capirci qualcosa. Il problema è che ora,
restituendo un oggetto, quando faccio

document.write(mioOggetto.stringa("bla bla").operaSullaStringa());

Ottengo ovviamente:

[object Object]

Proprio perché non restituisce più una stringa ma un oggetto a cui posso, come
detto anche da 4ndre4, concatenare altre funzioni operaSullaString() e simili.

E' tutto corretto? Se voglio stampare a video qualcosa devo per forza scordarmi
di poter concatenare funzioni?

Grazie ad entrambi.
4ndre4 24 Gen 2016 20:08
On 24/01/2016 18:45, albaserver@gmail.com wrote:
[...]
> E' tutto corretto? Se voglio stampare a video qualcosa devo per forza
scordarmi di poter concatenare funzioni?

Fai un override della metodo toString()

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString

YourObject.prototype.toString = function() {
return this.yourText;
};


--
4ndr4
"The use of COBOL cripples the mind; its teaching should, therefore, be
regarded as a criminal offense." (E. Dijkstra)
"Ora, questo "Delta11" non è nulla di più di uno scemo del
villaggio[...]" - http://goo.gl/1nrkkX
albaserver@gmail.com 24 Gen 2016 21:33
Il giorno domenica 24 gennaio 2016 20:08:33 UTC+1, 4ndre4 ha scritto:
> Fai un override della metodo toString()
>
> YourObject.prototype.toString = function() {
> return this.yourText;
> };

Pensa che ho aperto il gruppo per aggiungere: a meno che non sovrascriva
toString() con un metodo ad hoc :)

Grazie a entrambi, ho imparato qualcosa di nuovo!

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio JavaScript | Tutti i gruppi | it.comp.lang.javascript | Notizie e discussioni javascript | Javascript Mobile | Servizio di consultazione news.