2010-07-01 40 views
2

我有以下的命名空間(com.myCompany.myProject):JavaScript的命名空間字符串

var com = { 
    myCompany: { 
    myProject: { 
     x: 1, 
     y: 2, 
     o: function() { 
     } 
    } 
    } 
}; 

例如,我有以下代碼:

var self = com.myCompany.myProject; 

我怎麼能證明這個命名空間一個字符串,例如「com.myCompany.myProject」?

我試過JSON.stringify(),但它不是我期待的。

謝謝,

回答

1

這是不可能的。 對象無法知道它的存儲位置。

如果您需要這種功能,則必須將其存儲在對象中的某個位置。

var com = { 
    myCompany: { 
    myProject: { 
     x: 1, 
     y: 2, 
     '_namespace': 'com.myCompany.myProject', 
     o: function() { 
     } 
    } 
    } 
}; 
1

正如seanizer所說,這是不可能的。這裏有一些相關的事情是可能的,但:

index屬性爲一個字符串:

var self = com["myCompany"]["myProject"]; 

// or even... 
var myCo = "myCompany"; 
var myPr = "myProject"; 
var self = com[myCo][myPr]; 
alert(myCo + "." + myPr); 

得到一個對象的所有屬性爲字符串:

for(var p in com) { 
    alert(p.toString()); 
} 

要麼那些幫助你?

0

這可能不是你所需要的,但是,嘿,它可能。 Ext有一個名爲Ext.namespace的方法,別名爲Ext.ns.它的工作原理如下

Ext.ns('com.app.package'); com.app.package.Clazz = function(){};

http://dev.sencha.com/deploy/dev/docs/source/Ext.html#method-Ext-namespace

如果這會幫助你,用自己的源代碼作爲靈感。

+0

是的,我知道。我以前用過它,非常有用。但它並不是我期待的。 – 2010-10-15 11:05:13

0

你問過,這是我能想到的最簡單的方法。它涉及的eval,但請不要在此基礎上判斷:

var ns = 'com.myCompany.myProject' 
    ,self = eval(ns); 

console.log(self.x); // 1 
0

我也有過類似的要求,我想用一個對象映射,以避免在我的代碼串的神奇。例如,我想有地圖樣的消息:

var message = { 
    configuration: 
    { 
    pdms: 
    { 
     type: { 
     getTypes: {}, 
     getDatabases: {} 
     } 
    } 
    } 
}; 

現在不是使用一個字符串,如:

「message.configuration.pdms.type.getTypes」

我想要使​​用:

message.configuration.pdms.type.getTypes 

並將其轉換爲字符串。爲此,我使用以下效用函數。請注意,underscore庫是必需的。

var objectToString = (orig, string, obj) => { 
    var parse = (orig, string, obj) => { 
    return _.map(_.keys(orig), (key) => { 
     if (_.isEmpty(orig[key])) { 
     return orig[key] === obj ? string + '.' + key : ''; 
     } else { 
     return objectToString(orig[key], string + '.' + key, obj); 
     } 
    }); 
    }; 
    return _.chain(parse(orig, string, obj)) 
      .flatten() 
      .find ((n) => {return n.length > 0;}) 
      .value(); 
}; 

爲了使它更方便,我將源函數對象部分應用到字符串和根名稱空間。

var messageToString = _.partial(objectToString, message, 'message'); 

messageToString(message.configuration.pdms.type.getTypes); 
// returns: 'message.configuration.pdms.type.getTypes'