Это возможно с некоторым пользовательским кодом:
Сначала определите функцию пространства имен и функцию именованного объекта следующим образом:
var jaf = {}; // define a top level global object for your library
/**
* Creates a named Object with a <tt>name</tt> field which is assigned the
* <tt>strName</tt> and a toString method
* @private
* @param {String} strName The name of the named object
*/
function namedObject(strName) {
return {
name: strName,
toString: function() {
return this.name;
}
};
}
/**
* Createa new namespace(s) globally or returns existing ones if already created. Namespaces
* can be used to avoid creating a lot of global objects and structuring a project's
* modules and classes. Namespaces are like packages in java. The namespace is a
* simple string or a dot separated string of characters that are allowed in identifiers
* e.g. "jaf.core" is a valid namespace but "jaf.1" is not.
* @param {String} strNs The namespace string
* @return {Object} The namespace object
*/
var namespace = function(strNs) {
var arrNsc = strNs.split(".");
var nsObj = null;
var i = 0;
var len = arrNsc.length;
var nsName = "";
if(arrNsc[0] === "jaf") {
nsObj = jaf;
i = 1;
nsName = "jaf.";
}
for(; i < len; i++) {
var ns = arrNsc[i];
nsName += (ns + ".");
if(!nsObj) {
if(!window[ns]) {
nsObj = window[ns] = namedObject(nsName.substring(0, nsName.length - 1));
}else {
nsObj = window[ns];
}
}else {
if(!nsObj[ns]) {
nsObj = nsObj[ns] = namedObject(nsName.substring(0, nsName.length - 1));
}else {
nsObj = nsObj[ns];
}
}
}
return nsObj;
}
Затем вы можете сделать:
var ns = namespace("jaf.core.util");
ns.MyUtil = function() {
// do something important
}
Если вы измените переменную "jaf" как глобальный объект, убедитесь, что вы изменили функцию пространства имен с соответствующей переменной.Но вы также можете сделать что-то вроде:
var ns1 = namespace("abc.def.ghi")
ns1.get1() = function() {}
ns1.get2() = function() {}
ns1.get3() = function() {}
Это все равно будет работать так.