Newsgroup: it.comp.lang.javascript
Titolo: oggetto.nomeFunzione("stringa").operaSullaFunzione()

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.

 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.

 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

 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!

 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.

 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.

 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
 


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 banale 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.

 (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

 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.


  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.

 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.
 

 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;
};


 };
 
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!