如何以编程方式将函数添加到嵌套命名空间?

2024-01-18

假设我有一个函数,当我只传递一个字符串时,它会动态地为我创建命名空间(我很确定 YUI JS 库的作用):

MyObj.namespace('fn.method.name');

会导致

MyObj.fn.method.name = {}

正在创建 - 所有三个级别都相当于一个空对象。

不过,现在我想做的是最后一个关卡,在这种情况下name,设置为一个函数,但无需重新声明新创建的对象。
所以不要这样做:

function fnName() { /* some code here */ }
MyObj.namespace('fn.method.name');
MyObj.fn.method.name = new fnName();

我想打电话给这样的人:

MyObj.add('fn.method.name', fnName);

而在内部,add方法将以编程方式实例化传入的函数:

MyObj.fn.method.name = new fnName()

按照我实现的方式,我可以创建名称空间对象并将其设置为空对象,但是,当我尝试实例化传入函数并将该名称空间与传入函数关联时,它永远不会添加到名称空间。相反,总是返回一个空对象。有任何想法吗?

编辑:这是namespace方法。它作为 JSON 对象附加到基础对象,因此请忽略格式:

namespace: function (ns) {
    var _ns = ns.split('.'), 
        i = 0, nsLen = _ns.length,
        root = this;
    if (_ns[0] === gNS) {
        _ns.shift();
            nsLen = _ns.length;
        }
        for (i = 0; i < nsLen; i++) { 
            // create a property if it doesn't exist 
            var newNs = _ns[i];
            if (typeof root[newNs] === "undefined") {
                root[newNs] = {};
            }
            root = root[newNs];
        }
        return root;
    }

edit2 - 删除了传入的fn争论


您是否在寻找这样的东西:

var root = {};

function create(ns, fn) {
   var nsArray = ns.split(/\./);
   var currentNode = root;

   while(nsArray.length > 1) {
      var newNS = nsArray.shift();

      if(typeof currentNode[newNS] === "undefined") {
         currentNode[newNS] = {};
      }

      currentNode = currentNode[newNS];
   }

   if(fn) {
      currentNode[nsArray.shift()] = fn;
   }

   else {
      currentNode[nsArray.shift()] = {};
   }
}

Then:

create("a.b.c");

console.log(root.a);
console.log(root.a.b);
console.log(root.a.b.c);

Gives:

Object { b={...}}
Object { c={...}}
Object {}

And:

create("d.e.f", function() { console.log("o hai"); });

console.log(root.d);
console.log(root.d.e);
console.log(root.d.e.f);

Gives:

Object { e={...}}
Object {}
function()

调用您定义的函数:

root.d.e.f();

Gives:

o hai
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以编程方式将函数添加到嵌套命名空间? 的相关文章

随机推荐