2009-04-20 12 views
0

La solution à cette question a suggéré l'utilisation de la mise en œuvre de classe de John Resig. Cette solution couvre tous mes besoins sauf:Variable de classe dans la classe javascript

Comment déclarer une variable globale publique dans cette classe accessible depuis l'extérieur?

Je voudrais créer quelque chose comme ce qui suit:

var MyClass = Class.extend({ 

     EVENT_NAME : 'event-name', 

     init : function() { 
      // ... 
     } 

    }); 

// Now another file can directly read this value without creating the class object 
console.log(MyClass.EVENT_NAME); 

Répondre

4

La "seule" façon de faire ce que vous voulez faire est d'utiliser une fonction comme "classe". De cette façon, vous déclarez une "classe" dont les membres "statiques" publics sont accessibles. Quelque chose comme ceci:

function MyObject() { 
    // constructor stuff here 
} 
MyObject.EVENT_NAME = "event_name"; 

console.log(MyObject.EVENT_NAME); // No need to instantiate MyObject 

Cependant, me semble que vous mélangez les concepts de langues avec des trucs typés statiquement plus dynamique Javascript. Pourquoi voudriez-vous accéder à un membre d'un objet qui n'a pas été créé?

+0

il y a plein de raisons, et il y a déjà des exemples déjà cités dans Javascript: regardez tous les membres statiques et les méthodes de la classe Math: Math.PI, Math.round(), etc ... C'est juste une bonne idée si vous vouloir éviter les conflits. – nickf

+0

Que je comprends, mais ce que vous avez essentiellement dit, c'est que vous vouliez accéder à un membre d'une «classe» avant qu'il ne soit défini/créé. – Helgi

+0

J'ai besoin de déclarer des variables de champs statiques dans ma classe. Les autres classes qui utilisent MyObject doivent faire différentes comparaisons (si cela a du sens). Nicky a mentionné un bon exemple de Math.PI en étant un exemple. – Hady

1

Déclarez dans le contexte de la fenêtre ou ne pas utiliser le mot-clé 'var':

window.globalVar = somevalue 
globalVar = somevalue 
+0

yip, c'est mon plan de repli. Mais ma préférence serait de l'avoir avec sa classe qui le «possède». – Hady

0
var MyClass = Class.extend({ 

     EVENT_NAME : 'event-name', 

     init : function() { 
      // ... 
     } 
     return { 
      event_name: function() { return EVENT_NAME; } 
     } 

    }); 
    console.log(MyClass.event_name); 

En fait, Pour être honnête, je ne suis pas sûr de savoir comment cela va fonctionner avec .extend() car je n'ai pas utilisé extend() auparavant. Cependant, la technique return { name:value } est une manière assez courante d'exposer des méthodes d'instance publiques dans des objets. Il ne devrait pas falloir longtemps pour le tester correctement, désolé je n'ai pas eu l'occasion de le faire moi-même.

+0

Je signale également que l'EVENT_NAME: 'nom-événement' que vous avez * est * une variable globale, car vous n'avez pas devant lui 'var'. – Steerpike

Questions connexes