Newsgroup: it.comp.lang.javascript
Titolo: jQuery plugin: variabile "di istanza"

Ciao a tutti,
 
sto scrivendo un plugin per jQuery per un sito che sto facendo.
Ho seguito la classica struttura:
 
;(function($) {
 
  // var globale = {};
 
  $.fn.nomeplugin = function(options) {
 
    // var opts = faiqualcosa(options);
 
    return this.each(function() { ... miaFunzione(); ... });
 
  }
 
  function miaFunzione(params) {}
 
}(jQuery);
 
 
E ora viene la parte complicata da spiegare. Nell'html richiamo
 
$('elemento').nomeplugin({opzioni});
 
Nelle opzioni definisco alcune proprieta` che vorrei fossero visibili 
anche all'interno di miaFunzione (che viene richiamata sia direttamente 
nel this.each(function...) che in alcune callback onClick negli elementi 
che creo li`).
 
L'unico modo che ho trovato per farlo e` di definire una var opts (quella 
commentata) dentro nomeplugin e passarla come parametro alla funzione.
 
Ho paura che definendo una variabile "globale" (anche questa commentata 
nel codice sopra) questa venga gestita come tale, e che quindi se applico 
il plugin a diversi elementi con opzioni diverse, queste vengano 
sovrascritte dalle varie chiamate. Un po' come una variabile statica 
nella OOP classica.
 
C'e` un modo per simulare una variabile "di istanza"?
 
Grazie mille.
Bye.

 nel codice sopra)
 
Non ho capito, rispetto a quanto hai detto fin'ora, perché dovresti
definire una variabile "globale", come dici tu. Non mi è chiaro il
passaggio dalla tematica che hai appena esposto a questa. E si,
indubbiamente questa variabile viene condivisa da ogni chiamata di
`nomeplugin` (sempre per lo stesso motivo di cui sopra, ovvero che lo
scope è il medesimo).

 `nomeplugin`. Per intenderci:
 
Sono partito dal tuo messaggio e ho cercato di approfondire in rete.
Sembra che questo risolva:
 
;(function($) {
 
 var mioobj = function($elem, opts) {
 
   ... inizializza tutto...
 
   miaFunzione();
 
   var miaFunzione = function() {
 
     ... qui posso vedere opts ...
 
   }
 
 }
 
 
 $.fn.mioplugin = function(options) {
 
  var opts = $.extend({}, $.fn.mioplugin.defaults, options);
 
  return this.each(function() {
 
   new mioobj($(this), opts);
 
  });
 
 }
 
}(jQuery);
 
 
Comincio a capirne un po' di Javascript o sto facendo grosse cazzate? :)
 
Grazie.
Bye.
 

 Grazie.
 
Prego!
 

 in JavaScript, che penso possa esserti utile:
 
Grazie mille.
Bye.


 
Poteva chiedere direttamente a me, che ormai ho imparato tutto e capito 
tutto! :)

 li ho ancora capiti del tutto (e tutta la sua "OOP").
 
È OOP, senza virgolette :) Solo prototype based e non class based. In
pratica crei oggetti basati su altri oggetti. Puoi usare una funzione
come "costruttore", a mo' di classi, ma non è necessario (soprattutto da
ES5 in poi). Un esempio semplice:
 
    function Point(x, y) {
        this.setXY(x, y);
    }
 
    Point.prototype.setXY = function(x, y) {
        this.x = x || 0;
        this.y = y || 0;
    }
 
    var pointA = new Point();
    var pointB = new Point(4, 2);
 
    alert(pointA.x) // 0
    alert(pointB.x) // 4
 
    pointA.setXY(1,1);
 
    alert(pointA.x); // 1
 
Nota che, se invece di fare:
 
    var pointA = new Point();
 
Avessi fatto:
 
    var pointA = Point();
 
Avresti eseguito la funzione `Point`, non come costruttore, ma come
funzione. E quindi, in tal caso, `this` non sarebbe stato riferito alla
nuova istanza creata, bensì all'oggetto di contesto (in questo caso,
`window`).

 tutto! :)
 
Ehe. Niente gli vieta di farlo. ;)

 ES5 in poi). Un esempio semplice:
 
Mi sto leggendo "Object Oriented Javascript". Spero di assimilare in 
fretta i concetti. :)
 
Grazie mille per l'aiuto. :)
 
Bye.
 

 Grazie mille per l'aiuto. :)
 
De nada