开发者

In Javascript Adding namespace line like in C#

开发者 https://www.devze.com 2023-01-10 01:31 出处:网络
I want to write a line like i do in c# namespace abc.def.ghi{ get1(); get2(); get3(); get4(); } to reduce my text in so many line like

I want to write a line like i do in c#

namespace abc.def.ghi{

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

to reduce my text in so many line like

abc.d开发者_开发知识库ef.ghi.get1();
abc.def.ghi.get2();
abc.def.ghi.get3();
abc.def.ghi.get4();

Is it possible in javascript?


Objects. The way I learnt anyway

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

Edit

May have misunderstood the question. If you want to reduce the amount of typing needed, then go with

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

etc


This is possible with some custom code:

First define the namespace function and named object function like so:

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

Then you can do:

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

With if you change the variable "jaf" as global object make sure you change the namespace function with appropriate variable. But still you can also do something like:

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

It will still work this way.


You could use the with statement:

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

But:

Note: While using a with statement can make your program more concise, improper use of with can significantly slow down your program.

Performance wise it would be better to just store the reference of the object in a local variable as Psytronic suggests.

0

精彩评论

暂无评论...
验证码 换一张
取 消