В Javascript добавление строки пространства имен, как в C # - PullRequest
5 голосов
/ 30 июля 2010

Я хочу написать строку, как я делаю, в c #

namespace abc.def.ghi{

   get1();
   get2();
   get3();
   get4();    
}

, чтобы уменьшить мой текст на столько строк, как

abc.def.ghi.get1();
abc.def.ghi.get2();
abc.def.ghi.get3();
abc.def.ghi.get4();

Возможно ли это в JavaScript?

Ответы [ 3 ]

3 голосов
/ 30 июля 2010

Объекты. Как я узнал в любом случае

var abc = {};
abc.def = {};
abc.def.ghi = {};
abc.def.ghi.get1 = function(){};
abc.def.ghi.get2 = function(){};
abc.def.ghi.get3 = function(){};
abc.def.ghi.get4 = function(){};

Редактировать

Возможно, неправильно понял вопрос. Если вы хотите уменьшить количество набираемого текста, наберите

var ns = abc.def.ghi;
ns.get1();

и т.д.

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

Это возможно с некоторым пользовательским кодом:

Сначала определите функцию пространства имен и функцию именованного объекта следующим образом:

     var jaf = {}; // define a top level global object for your library


     /**
      * Creates a named Object with a <tt>name</tt> field which is assigned the
      * <tt>strName</tt> and a toString method
      * @private
      * @param {String} strName The name of the named object
      */
     function namedObject(strName)  {
        return {
           name: strName,
           toString: function() {
              return this.name;
           }
        };
     }



     /**
      * Createa new namespace(s) globally or returns existing ones if already created. Namespaces
      * can be used to avoid creating a lot of global objects and structuring a project's
      * modules and classes. Namespaces are like packages in java. The namespace is a
      * simple string or a dot separated string of characters that are allowed in identifiers
      * e.g. "jaf.core" is a valid namespace but "jaf.1" is not.
      * @param {String} strNs The namespace string
      * @return {Object} The namespace object
      */
     var namespace = function(strNs) {
        var arrNsc = strNs.split(".");
        var nsObj = null;
        var i = 0;
        var len = arrNsc.length;

        var nsName = "";

        if(arrNsc[0] === "jaf")  {
           nsObj = jaf;
           i = 1;
           nsName = "jaf.";
        }

        for(; i < len; i++)  {
           var ns = arrNsc[i];
           nsName += (ns + ".");

           if(!nsObj) {
              if(!window[ns])   {
                 nsObj = window[ns] = namedObject(nsName.substring(0, nsName.length - 1));
              }else {
                 nsObj = window[ns];
              }
           }else {
              if(!nsObj[ns])   {
                 nsObj = nsObj[ns] = namedObject(nsName.substring(0, nsName.length - 1));
              }else {
                 nsObj = nsObj[ns];
              }
           }
        }

        return nsObj;
     }

Затем вы можете сделать:

     var ns = namespace("jaf.core.util");
     ns.MyUtil = function() {
        // do something important
     }

Если вы измените переменную "jaf" как глобальный объект, убедитесь, что вы изменили функцию пространства имен с соответствующей переменной.Но вы также можете сделать что-то вроде:

   var ns1 = namespace("abc.def.ghi")
   ns1.get1() = function() {}
   ns1.get2() = function() {}
   ns1.get3() = function() {}

Это все равно будет работать так.

0 голосов
/ 30 июля 2010

Вы можете использовать оператор with:

with (abc.def.ghi){    
   get1();
   get2();
   get3();
   get4();    
}

Но:

Примечание. Использование оператора with может сделать вашу программу болеесжатое, неправильное использование with может значительно замедлить вашу программу.

Производительность, поэтому было бы лучше просто сохранить ссылку на объект в локальной переменной, как подсказывает Psytronic .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...