2010-09-03 29 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' });