Я использую очень распространенный шаблон пространства имен, но хочу расширить его, чтобы передать второй параметр - PullRequest
0 голосов
/ 05 августа 2011

Мое нынешнее пространство имен выглядит так

var MY = MY || {};
MY.namespace = function(str){};

Итак, вы можете просто создать MY.namespace("new");, а затем My.new = function(){};

Но теперь я хочу передать второй параметр, например MY.namespace("new", function(){});. Как я могу достичь этого подхода?

edit1:

var MY.namespace = function(ns_string){
     var parts = ns_string.split('.'),
         parent =MY,i;
     if(parts[0]==="MY"){
         parts = parts.slice(1);
     }

     for(i=0; i< parts.length ;i++){
         if (typeof parent[parts[i]] ==="undefined"){
             parent[parts[i]] ={};
         }

         parent = parent[parts[i]];
     }
     return parent;
};

Ответы [ 3 ]

0 голосов
/ 05 августа 2011

JavaScript не накладывает ограничений на количество аргументов функции. Объект arguments в функции может использоваться для доступа ко всем аргументам, переданным функции в виде массива, даже если они не названы в списке параметров:

My.namespace = function(fnName) {
    // arguments[0] gives us the same things as fnName
    // however, using indexes from 1 to (arguments.length-1)
    // gives the other (nameless) parameters
}
0 голосов
/ 05 августа 2011

Не уверен, что это то, что вы имеете в виду.Принимая во внимание ваши изменения, реакцию Кевина и то, что вы предлагаете в своих комментариях, вы могли бы иметь в виду следующее:

var MY = {};
MY.namespace = function(ns_string, fnBody){
 var parts = ns_string.split('.'),
     parent =MY,i,
     last = parts.slice(parts.length-1);

 console.log(parent);
 if(parts[0]==="MY"){
     parts = parts.slice(1);
 }

 if (parts.length !== 1) {
     parts = parts.slice(0, parts.length-1);
 }

 for(i=0; i< parts.length ;i++){
     if (typeof parent[parts[i]] ==="undefined"){
         parent[parts[i]] ={};
     }

     parent = parent[parts[i]];
 }
 parent[last] = fnBody;
 return parent;
};

Это будет работать как

> MY.namespace('ns1.ns2.myFn', function(console.log('this is myFn')));
> MY.ns1.ns2.myFn();
this is myFn
0 голосов
/ 05 августа 2011

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

My.namespace = function(fnName, fnBody) {
  My[fnName] = fnBody;
}

например

My.namespace('sayHi', function(){alert('hi');});
My.sayHi();
...