我正在使用一种非常常见的名称空间模式,但希望对其进行扩展以传递第二个参数

I am using a very common namespacing pattern but want to extend it to pass a second parameter

本文关键字:希望 模式 第二个 参数 扩展 空间 常常见 非常 一种      更新时间:2023-09-26

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

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

您可以使用:

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

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

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
}

不确定这是否是你的意思。考虑到你的编辑、凯文的回复以及你在评论中的建议,你的意思可能是:

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