2010-09-03 25 views
4

我正在尝试在特定名称空间(dpcom)下添加函数。这可能是点符号,取决于用户在他们的JavaScript文件中做了什么。所以基本上,我希望他们做的是这样的:关于使这一点的Javascript代码更性感的建议?

dpcom.library('something.foo.funcName', function() { 
    // Code goes here. 
}) 

然后,他们可以拨打他们的东西后,如:

dpcom.something.foo.funcName(); 

将执行他们上面定义的代码。我想,在使其成为性感帮助的代码是在这里(它使用jQuery):

dpcom.library = function(name, func) { 
    root = dpcom; 
    objects = name.split('.'); 
    lastElement = objects[objects.length - 1]; 

    $(objects).each(function(idx, elem) { 
     if (elem == lastElement) { 
      root[elem] = func; 
     } else if (!root[elem]) { 
      root[elem] = {} 
     } 
     root = root[elem]; 
    }); 
} 

这应该处理可能的点符号,创造在我的命名空间中的对象,如果他们不存在(我不要覆盖任何已经声明的对象)。

我上面的代码似乎工作得很好,但我有一种感觉,我可以做得更好,但我的大脑并没有告诉我在哪里......任何人都想刺穿它?

+6

如果你觉得代码可以是性感,你无可救药IMO ;-) – 2010-09-03 15:32:30

+4

代码可能会变成一种性感。 – Stephen 2010-09-03 15:41:21

+1

我完全同意......在这一点上,我无能为力。 :) – intargc 2010-09-03 16:30:21

回答

3

你应该使用shift()能够做到这在一个稍微更吸引人的方式:

dpcom.library = function(name, func) { 
    var root = dpcom, 
     objects = name.split('.'), 
     elem; 

    while (elem = objects.shift()) { 
     if (objects.length) { 
      if (!root[elem]) 
       root[elem] = {}; 
      root = root[elem]; 
     } 
     else 
      root[elem] = func; 
    } 
} 

这样,你可以抛弃jQuery的要求。另外,不要忘记用关键字var明确声明你的变数。

根据你的性感定义代码,你也可以更换此块:

 if (objects.length) { 
      if (!root[elem]) 
       root[elem] = {}; 
      root = root[elem]; 
     } 

有:

 if (objects.length) 
      root = !root[elem] ? root[elem] = {} : root[elem]; 
1

下面是它

dpcom.library = function(name, func) { 
    var lastElement, root = dpcom, objects = name.split(/\./); 
    lastElement = objects[objects.length - 1]; 

    $.each(objects, function(idx, elem) { 
     if (!root[elem]) { 
      if (elem == lastElement) { 
       root[elem] = func; 
      } else { 
       root[elem] = {} 
       root = root[elem]; 
      } 
     } 
    }); 
} 

编辑刺:

,我发现自己使用jQuery的这种扩展方法。查看文档here

0

不知道这是任何性感或更易读,但并不需要DA查询和还没有任何全局变量;)

var dpcom = {'test': null, 'something': {}}; 
dpcom.library = function(name, func) { 
    for(var i = 0, node = this, names = name.split('.'), l = names.length; i < l; i++) { 
     node = node[names[i]] = ((i == l - 1) ? func : node[names[i]] || {}); 
    } 
}; 

dpcom.library('something.foo.funcName', function() { 
    // Code goes here. 
}); 

结果:

{ test: null 
, library: [Function] 
, something: { foo: { funcName: [Function] } } 
} 
3

这是某种怪异的代码高尔夫?

试试这个,它可能工作...

dpcom.library = function(name, func) { 
    var p = name.split('.'), e, root = this; 
    while (e = p.shift()) root = root[e] = root[e] || (!p.length ? func : {}); 
} 
+0

使用“String”而不是“RegExp”来为“split”分配+1。 – 2010-09-03 16:37:50

0

退房YUI 2的命名空间功能:

YAHOO.namespace('myNS').funcName = function(){/* do something with arguments */}; 
1

使用的阵列的reduce方法,

dpcom.library = function(key, value) { 
    var objects = key.split('.'); 
    var leaf = objects.pop(); 

    var constructHierarchy = function(object, property) { 
     return (object[property] = object[property] || {}); 
    }; 

    objects.reduce(constructHierarchy, dpcom)[leaf] = value; 
}; 

为了增加性感的因素,使第二值,通用的,不只是一个功能。它已经在所有回答做了,但作为明确的关于它的帮助:)

dpcom.library('awesome.object', { foo: 'woah' });