【问题标题】:javascript namespace as stringjavascript 命名空间作为字符串
【发布时间】:2011-03-10 16:14:15
【问题描述】:

我有以下命名空间 (com.myCompany.myProject):

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

例如,我有以下代码:

var self = com.myCompany.myProject;

如何将此命名空间显示为字符串,例如“com.myCompany.myProject”?

我试过 JSON.stringify() 但不是我要找的。​​p>

谢谢,

【问题讨论】:

    标签: javascript jquery namespaces introspection


    【解决方案1】:

    这是不可能的。 对象无法知道它的存储位置。

    如果您需要这种功能,则必须将其存储在对象中的某个位置。

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

    【讨论】:

      【解决方案2】:

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

      这些对你有帮助吗?

      【讨论】:

        【解决方案3】:

        这可能不是您真正需要的,但嘿,它可能。 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

        如果这对您有帮助,请使用他们的源代码作为灵感。

        【讨论】:

        • 是的,我知道。我以前用过,很好用。但这不是我要找的。​​span>
        【解决方案4】:

        你问如何,这是我能想到的最简单的方法。涉及到eval,但请不要以此为依据判断:

        var ns = 'com.myCompany.myProject'
            ,self = eval(ns);
        
        console.log(self.x); // 1
        

        【讨论】:

          【解决方案5】:

          我有类似的要求,我想使用对象映射来避免在我的代码中出现神奇的字符串。例如,我想要一个消息地图,例如:

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

          现在不要使用像这样的字符串:

          “message.configuration.pdms.type.getTypes”

          我想使用:

          message.configuration.pdms.type.getTypes
          

          并将其转换为字符串。为此,我使用以下实用功能。请注意,underscore 库是必需的。

          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'
          

          【讨论】:

            猜你喜欢
            • 2013-04-01
            • 2016-10-08
            • 1970-01-01
            • 1970-01-01
            • 2016-11-25
            • 1970-01-01
            • 2016-07-11
            • 1970-01-01
            • 2012-07-21
            相关资源
            最近更新 更多