0

我现在的命名空间是这样的

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

所以基本上,你可以创建MY.namespace("new");然后My.new = function(){};

但是现在,我想传递第二个参数,例如MY.namespace("new", function(){});. 我怎样才能实现这种方法?

编辑1:

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

3 回答 3

0

您可以使用:

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

例如

My.namespace('sayHi', function(){alert('hi');});
My.sayHi();
于 2011-08-04T23:14:19.953 回答
0

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
}
于 2011-08-04T23:18:58.783 回答
0

不确定这是否是您的意思。考虑到您的编辑、凯文的回应以及您在评论中似乎提出的建议,您的意思可能是这样的:

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
于 2011-08-05T01:30:36.847 回答