2012-10-24 3 views
1

J'ai simulé une variable de classe statique en Javascript.Comment créer un membre statique pour un objet dans un espace de noms en JavaScript?

MyObject.staticVariable = "hello world"; 

function MyObject() { 
    // do something 
} 

MyObject.prototype.someFunction = function() ... 

Je ne comprends pas pourquoi cette syntaxe fonctionne parce que je ne crée pas MyObject explicitement (et comment pourrais-je et encore une fonction MyObject?) Avant affecter la propriété staticVariable. Mais cela fonctionne, et je l'ai vu dans de nombreuses réponses à la question: comment simuler une variable de classe statique en Javascript?

Comment puis-je obtenir cette fonctionnalité lorsque je déclare la fonction MyObject dans un espace de noms? Faites-moi savoir si je peux clarifier et/ou si ma réflexion est éteinte. Merci.

Répondre

4

Les déclarations de fonction sont "hissées" en haut de l'environnement lexical actuel.

Cela signifie que la fonction existe avant tout autre code dans cet environnement.

// This works 

MyObject.staticVariable = "hello world"; 

function MyObject() { 
    // do something 
} 

// This does not 

MyObject.staticVariable = "hello world"; 

var MyObject = function() { 
    // do something 
} 

Dans votre exemple Namespace, il est effectivement le même que le second exemple. Cela signifie que vous devrez vous assurer que l'affectation des fonctions a lieu en premier.

0

Les déclarations de fonction sont hissées, c'est-à-dire que vous pouvez les utiliser au-dessus de leur instanciation. Cependant, la fonction expressions ne sont pas. Dans votre exemple, vous faites ceci:

Namespace.MyObject.staticVariable = "hello world"; 

Namespace.MyObject = function() { 
    // do something 
} 

Cela ne fonctionnera pas parce que Namespace.MyObject n'a pas été (et ne peut pas être) créé comme une déclaration de fonction. En ce qui concerne la simulation de la fonctionnalité, utilisez une fonction:

function add(prop, val) { 
    Namespace.MyObject[ prop ] = val; 
} 

Cela vous permettra d'ajouter des propriétés à l'objet avant de créer explicitement les:

add("staticVariable", "Hello World"); 

Namespace.MyObject = function() { 
    // do something 
}; 
0

Pourriez-vous préciser ce que vous entendez par la variable de classe statique ? JavaScript n'est pas la même chose que Java.

Si vous voulez une constante qu'aucun client ne peut modifier, vous pouvez utiliser des fermetures. Par exemple:

var Namespace = {}; 
Namespace.MyObject = (function(){ 
    var staticVariable = "hello world"; 

    //this will be assigned to "MyObject" 
    return { 
    someFunction: function() { 
     //refer to staticVariable here 
     //no client can modify staticVariable directly; 
     //only through the methods you provide 
    } 
    }; 
})(); 
+0

Merci. Cela fournit plus d'informations que j'ai besoin, mais je pense que c'est une information utile. Je n'ai pas vraiment de langue de référence en tête, et je voulais remplacer la classe par l'objet. Je ne m'inquiète pas encore de la protection de mes objets internes, et c'est un peu au-delà de moi pourquoi quelqu'un voudrait le faire en JavaScript, mais nous verrons comment évolue ma pensée. – user1771594

Questions connexes