пространство имен javascript в виде строки - PullRequest
2 голосов
/ 01 июля 2010

У меня есть следующее пространство имен (com.myCompany.myProject):

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

Например, у меня есть следующий код:

var self = com.myCompany.myProject;

Как мне показать это пространство имен в виде строки, например, "com.myCompany.myProject"?

Я пробовал JSON.stringify (), но я не искал.

Спасибо

Ответы [ 5 ]

1 голос
/ 01 июля 2010

Как говорит seanizer, это невозможно.Вот некоторые связанные вещи, которые возможны, однако:

свойство индекса в виде строки:

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

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

получить все свойства объекта в виде строк:

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

Поможет ли кто-нибудь из них?

1 голос
/ 01 июля 2010

Это невозможно. У объекта нет возможности узнать, где он хранится.

Если вам нужна такая функциональность, вы должны хранить ее где-то в объекте.

var com = {
  myCompany: {
    myProject: {
      x: 1,
      y: 2,
      '_namespace': 'com.myCompany.myProject',
      o: function() {
      }
    }
  }
};
0 голосов
/ 29 января 2015

У меня было похожее требование, я хочу использовать карту объектов, чтобы в моем коде не было волшебных строк.Например, я хочу иметь карту сообщений вроде:

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

Теперь вместо использования строки вроде:

"message.configuration.pdms.type.getTypes"

Я хочу использовать:

message.configuration.pdms.type.getTypes

И преобразовать это в строку.Для этого я использую следующую служебную функцию.Обратите внимание, что требуется подчеркивание lib.

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();
};

Чтобы сделать его более удобным, я частично применяю эту функцию с исходным объектом для преобразования в строки и корневое пространство имен.

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

messageToString(message.configuration.pdms.type.getTypes);
// returns: 'message.configuration.pdms.type.getTypes'
0 голосов
/ 25 ноября 2011

Вы спросили, как, вот самый простой способ, который я могу придумать.Это связано с eval, но, пожалуйста, не судите на этом основании:

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

console.log(self.x); // 1
0 голосов
/ 12 октября 2010

Это может быть не совсем то, что вам нужно, но, эй, может. Ext имеет метод Ext.namespace с псевдонимом Ext.ns. Это работает следующим образом

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

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

Если это поможет вам, используйте их исходный код в качестве вдохновения.

...