2009-06-01 3 views
0

Il y a une persistance basique de Javascript vars/etc. Vous appelez une fonction/méthode et la prochaine fois que vous appelez cette même fonction/méthode, elle conserve les données de la dernière fois.Comment bien travailler _around_ Javascript persistence?

Vous pouvez supprimer les vars lorsque vous en avez fini avec eux, mais cela supprime l'avantage d'utiliser à nouveau le code pour cette instance.

Alors, quel est le bonne façon d'écrire du code qui peut être réutilisé, sur différents éléments, à l'intérieur de la même page.

Par conséquent, j'ai besoin de la capacité d'écrire du code afin que je puisse pointer sur plusieurs éléments différents, puis interagir avec ce code séparé pour chaque élément.

Ainsi en PHP (comme exemple) que je ferais:

$element1 = new MyClass(); 
$element2 = new MyClass(); 
$element3 = new MyClass(); 

dans ce cas, il est le même code en cours d'exécution dans trois champs distincts. Comment puis-je faire cela correctement avec JS. Même l'utilisation de extend() de jQuery me pose des problèmes.

Merci.

Répondre

3

Pour créer une instance en JavaScript, vous devez écrire une fonction constructeur et l'appeler en utilisant new. Par exemple:

function MyClass(somevalue) { 
    this.somevalue = somevalue; 
    this.somefunction = function() { 
    alert(somevalue); 
    } 
} 

var instance1 = new MyClass(1); 
var instance2 = new MyClass(2); 
var instance3 = new MyClass(3); 
+0

Ok, en fait j'ai lu un peu sur l'utilisation d'un constructeur pour cela, mais je n'ai jamais pu trouver quoi que ce soit avancer sur ce qui constitue un constructeur dans JS. En PHP, vous utilisez simplement la fonction __construct(), mais dans la plupart des cas, lorsque vous essayez d'instancier une classe dans JS, une erreur se produit, affirmant qu'il n'y a pas de constructeur. Alors qu'est-ce qui fait qu'un constructeur est un constructeur (en JS)? Merci. – Spot

+0

Une fonction de constructeur en JavaScript est semblable à une définition de classe et à une fonction de constructeur, comme dans d'autres langages, mais roulée en une seule. –

+0

Ok, ça me donne un peu plus d'infos. Je vais google pour plus. Merci! – Spot

7

Utilisez le mot-clé var lors de la définition de variables locales (sinon, elles seront définies par défaut sur globales).

function foo() { 
    var i; 
    // code code code code 
} 
+0

J'ai toujours connu beaucoup de problèmes avec cela. Cependant, l'utilisation de _var_ ne modifie pas seulement l'espace de noms dans la structure du bloc, elle affecte également la portée de la persistance. – Spot

+4

Il n'y a pas de "persistance" - si vous n'utilisez pas 'var', vous déclarez simplement les variables comme globales, afin qu'elles ne soient pas mises hors service après le retour de la fonction. (Au moins je le pense.) – grawity

+0

Alors, comment pouvez-vous utiliser des instances de différence de la même var en même temps (même page)? C'est ce que je cherche. Je sais que c'est faisable, je ne suis pas sûr de la meilleure façon d'y arriver. – Spot

1

Vous pouvez nommer votre JavaScript pour qu'il ressemble beaucoup à ce que vous recherchez. Voir ci-dessous pour un exemple. Il semble que votre problème soit lié à l'utilisation de variables globales dans lesquelles vous voulez utiliser des variables locales, c'est-à-dire que vous déclarez var myvariable; en dehors de votre fonction, mais seulement vouloir l'utiliser et l'oublier dans votre fonction. Dans ce cas, déclarez la variable dans votre fonction pour la rendre locale.

var MyNameSpace = function() { 
    return { 
     sayhello : function() { 
      alert("hello"); 
     }, 
     saygoodbye : function() { 
      alert("see ya"); 
     } 
    }; 
}(); 
+0

Il s'agit en fait d'un tableau associatif de fonctions - et la fonction externe() {}, et le retour, n'est pas nécessaire. – grawity

+0

Je ne veux pas 'l'utiliser et l'oublier' cependant. Je veux être capable de l'utiliser, et de le référencer spécifiquement, tout en le référençant spécifiquement pour d'autres instances. Je cherche un instancing_ approprié. Si ça a du sens. – Spot

+0

Vous pouvez réellement déclarer un "var" à l'intérieur de cet "espace de nommage", ce qui signifierait qu'il existerait dans votre instance de cet espace de nom, mais n'interférerait pas avec d'autres variables en dehors de celui-ci. Déclarez simplement "var private_var;" en l'ajoutant à une nouvelle ligne avant le mot return (c'est pourquoi vous voulez réellement la fonction externe et le retour aussi!) – Fenton

0

Il semble que ce que vous recherchez soit la possibilité d'avoir des instances d'une classe et d'avoir des données privées associées à chaque instance.

Vous pouvez le faire en utilisant la technique suivante:

function Foo() 
{ 
    // Member variable only visible inside Foo() 

    var myPrivateVar;  

    // Function only visible inside Foo() 

    var myPrivateFunction = function() 
          { 
           alert("I'm private!"); 
          } 

    // Member variable visible to all 

    this.myPublicVar = "Hi, I'm public!"; 

    // Function visible to all 

    this.myPublicFunction = function() 
          { 
           myPrivateVar = "I can set this here!"; 
          } 
} 

Vous pouvez créer et utiliser un de ces utilisant la syntaxe suivante:

var myFoo = new Foo(); 

myFoo.myPublicVar = "I can set this!"; 
myFoo.myPublicFunction();