2010-07-01 3 views
2

je l'espace de noms suivant (com.myCompany.myProject):javascript espace de nom en tant que chaîne

var com = { 
    myCompany: { 
    myProject: { 
     x: 1, 
     y: 2, 
     o: function() { 
     } 
    } 
    } 
}; 

Par exemple, j'ai le code suivant:

var self = com.myCompany.myProject; 

Comment puis-je montrer cet espace de noms comme une chaîne, par exemple "com.myCompany.myProject"?

J'ai essayé JSON.stringify() mais ce n'est pas ce que j'ai cherché.

Merci,

Répondre

1

Ce n'est pas possible. Un objet n'a aucun moyen de savoir où il est stocké.

Si vous avez besoin de ce type de fonctionnalités, vous devez les stocker quelque part dans l'objet.

var com = { 
    myCompany: { 
    myProject: { 
     x: 1, 
     y: 2, 
     '_namespace': 'com.myCompany.myProject', 
     o: function() { 
     } 
    } 
    } 
}; 
1

Comme le dit le seanizer, cela n'est pas possible. Voici quelques choses connexes qui sont possibles, bien que:

propriété index comme une chaîne:

var self = com["myCompany"]["myProject"]; 

// or even... 
var myCo = "myCompany"; 
var myPr = "myProject"; 
var self = com[myCo][myPr]; 
alert(myCo + "." + myPr); 

obtenir toutes les propriétés d'un objet sous forme de chaînes:

for(var p in com) { 
    alert(p.toString()); 
} 

Est-ce que l'un de ces vous aider ?

0

Ceci peut ne pas être exactement ce que vous avez besoin, mais bon, il peut. Ext a une méthode appelée Ext.namespace, alias Ext.ns. Il fonctionne comme suit

Ext.ns ('com.app.package'); com.app.package.Clazz = function() {};

http://dev.sencha.com/deploy/dev/docs/source/Ext.html#method-Ext-namespace

Si cela vous aidera, utiliser leur code source d'inspiration.

+0

Oui, je sais. Je l'ai déjà utilisé, très utile. Mais ce n'est pas ce que j'ai cherché. –

0

Vous avez demandé comment, voici la façon la plus simple que je puisse penser. Il implique eval, mais s'il vous plaît ne pas juger sur cette base:

var ns = 'com.myCompany.myProject' 
    ,self = eval(ns); 

console.log(self.x); // 1 
0

J'ai eu une exigence similaire, je veux utiliser une carte d'objet pour éviter d'avoir des chaînes magiques dans mon code. Par exemple, je veux avoir une carte de messages comme:

var message = { 
    configuration: 
    { 
    pdms: 
    { 
     type: { 
     getTypes: {}, 
     getDatabases: {} 
     } 
    } 
    } 
}; 

maintenant au lieu d'utiliser une chaîne comme:

"message.configuration.pdms.type.getTypes"

Je veux utiliser:

message.configuration.pdms.type.getTypes 

Et convertir cela en une chaîne. Pour cela, j'utilise la fonction d'utilité suivante. Notez que la bibliothèque underscore est requise.

var objectToString = (orig, string, obj) => { 
    var parse = (orig, string, obj) => { 
    return _.map(_.keys(orig), (key) => { 
     if (_.isEmpty(orig[key])) { 
     return orig[key] === obj ? string + '.' + key : ''; 
     } else { 
     return objectToString(orig[key], string + '.' + key, obj); 
     } 
    }); 
    }; 
    return _.chain(parse(orig, string, obj)) 
      .flatten() 
      .find ((n) => {return n.length > 0;}) 
      .value(); 
}; 

Pour le rendre plus pratique appliquer, je partielle cette fonction avec l'objet source de se tourner vers les chaînes et l'espace de noms racine.

var messageToString = _.partial(objectToString, message, 'message'); 

messageToString(message.configuration.pdms.type.getTypes); 
// returns: 'message.configuration.pdms.type.getTypes' 
Questions connexes