我有以下命名空间(com.myCompany.myProject):
var com = {
myCompany: {
myProject: {
x: 1,
y: 2,
o: function() {
}
}
}
};
例如,我有以下代码:
var self = com.myCompany.myProject;
如何将此命名空间显示为字符串,例如“com.myCompany.myProject”?
我尝试过JSON.stringify(),但这不是我要找的。 p>
谢谢,
答案 0 :(得分:1)
这是不可能的。 对象无法知道它的存储位置。
如果您需要这种功能,则必须将其存储在对象中的某个位置。
var com = {
myCompany: {
myProject: {
x: 1,
y: 2,
'_namespace': 'com.myCompany.myProject',
o: function() {
}
}
}
};
答案 1 :(得分:1)
正如seanizer所说,这是不可能的。以下是一些可能的相关事项:
索引属性为字符串:
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());
}
其中任何一个会帮助你吗?
答案 2 :(得分: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
如果这对您有帮助,请使用他们的源代码作为灵感。
答案 3 :(得分:0)
你问怎么样,这是我能想到的最简单的方法。它涉及评估但请不要在此基础上判断:
var ns = 'com.myCompany.myProject'
,self = eval(ns);
console.log(self.x); // 1
答案 4 :(得分:0)
我有类似的要求,我想使用一个对象图来避免在我的代码中有神奇的字符串。例如,我想要一个消息地图,如:
var message = {
configuration:
{
pdms:
{
type: {
getTypes: {},
getDatabases: {}
}
}
}
};
现在不使用像:
这样的字符串“message.configuration.pdms.type.getTypes”
我想用:
message.configuration.pdms.type.getTypes
并将其转换为字符串。为此,我使用以下实用程序功能。请注意,underscore lib是必需的。
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'