2011-05-13 52 views

回答

2

現在你走了,將保留現有的對象:

var namespace = function(name, separator, container){ 
    var ns = name.split(separator || '.'), 
    o = container || window, 
    i, 
    len; 
    for(i = 0, len = ns.length; i < len; i++){ 
    o = o[ns[i]] = o[ns[i]] || {}; 
    } 
    return o; 
}; 

例如,用法:

namespace("com.example.namespace"); 
com.example.namespace.test = function(){ 
    alert("In namespaced function."); 
}; 

或爲你的例子使用數組。

var ns = ['bob', 'sue', 'dan']; 
namespace(ns.join('.')); 
bob.sue.dan.foobar = true; 

或擴展現有對象:

var bob = {} 
namespace("foo.bar",".",bob); 
bob.foo.bar = true; 

編輯:根據請求更新:

var namespace = function(name, separator, container, val){ 
    var ns = name.split(separator || '.'), 
    o = container || window, i, len; 
    for(i = 0, len = ns.length; i < len; i++){ 
     var v = (i==len-1 && val) ? val : {}; 
     o = o[ns[i]] = o[ns[i]] || v; 
    } 
    return o; 
}; 

namespace("bob.sue.dan",null,null,5); 
alert(bob.sue.dan); 

參見工作實施例:http://jsfiddle.net/herostwist/hu6j9/

+0

我喜歡你的解決方案的優雅。有沒有一種方法可以編輯它以在函數本身中給出一個值? – 2011-05-13 07:54:24

+0

例如:命名空間(名稱,分隔符,容器,值) – 2011-05-13 08:23:23

+0

更新爲接受可選值參數:) – herostwist 2011-05-13 09:03:28

-1

是的,這是可能的。

可以在對象上定義新的屬性是這樣的:

var obj = {}; 
obj["bob"] = {}; 
obj["bob"]["sue"] = {}; 
obj["bob"]["sue"]["dan"] = 5; 

所以,你也可以用屬性名稱的數組做到這一點;)

+1

這不是動態創建的對象 – Teneff 2011-05-13 07:04:21

+0

特別是因爲我不想打擾已經在其他層次結構中的任何其他屬性 – 2011-05-13 07:06:07

+0

@Teneff我從來沒有說過它是一個動態創建的對象。我只向您展示了您可以通過字符串動態定義屬性的方式。這正是你需要的;)我認爲-1是不公平的...... – 2011-05-13 07:09:09

0

相信你能...

var obj = 5; 
var yourarray = ['bob', 'sue', 'dan']; 

yourarray = yourarray.reverse(); 
for(e in yourarray) { 
    var tmpobj = obj; 
    obj = new Object(); 
    obj[yourarray[e]] = tmpobj; 

    // if you already have an object 
    if (e+1 == yourarray.length) { 
     your_current_existing_object[yourarray[e]] = tmpobj; 
    } 
} 
+0

如果我已經有了一些具有一些填充屬性的對象會發生什麼? – 2011-05-13 07:07:42

+0

不要在數組中使用for..in,除非有很好的理由,並且已經保護了它們免受弱點影響。 – RobG 2011-05-13 07:11:34

2

然後,你可以這樣做:

function makeOjectTree(propNames) { 
    var name; 
    var o = {}; 
    var result = o; 

    for (var i=0, iLen=propNames.length; i<iLen; i++) { 
    name = propNames[i]; 

    if (!o[name]) { 
     o[name] = {}; 
     o = o[name]; 
    } 
    } 
    return result; 
} 
2
var names = ['bob', 'sue', 'dan']; 
var objs = []; 

for(var i=0; i<names.length; i++) { 
    objs.push(names[i]); 
    var val = (i==names.length-1) ? "5" : "{}"; 
    eval(objs.join(".") + " = " + val); 
} 

alert(bob.sue.dan); 

演示:http://jsfiddle.net/EpZm2/1/