今天,我导入MicrosoftAjax.debug.js后,发现在JScript的编辑器中,Sys居然是命名空间的形式体现!而我以前使用这种方法:
var ZU = {};
体现的是一个属性,用另一种方法:
ZU = function () {};
体现的是一个方法,从来没有体现出命名空间的。
查看它的代码,先是这一句:
Type.registerNamespace('Sys');
表示注册了一个命名空间,然后再找其对应的函数:
Type.registerNamespace = function Type$registerNamespace(namespacePath)
{
/// <param name="namespacePath" type="String"></param>
var e = Function._validateParams(arguments, [
{ name: "namespacePath", type: String }
]);
if (e) throw e;
if (!Type.__fullyQualifiedIdentifierRegExp.test(namespacePath)) throw Error.argument('namespacePath', Sys.Res.invalidNameSpace);
var rootObject = window;
var namespaceParts = namespacePath.split('.');
for (var i = 0; i < namespaceParts.length; i++)
{
var currentPart = namespaceParts[i];
var ns = rootObject[currentPart];
if (ns && !ns.__namespace)
{
throw Error.invalidOperation(String.format(Sys.Res.namespaceContainsObject, namespaceParts.splice(0, i + 1).join('.')));
}
if (!ns)
{
ns = rootObject[currentPart] = {};
if (i === 0)
{
window.__rootNamespaces[window.__rootNamespaces.length] = ns;
}
ns.__namespace = true;
ns.__typeName = namespaceParts.slice(0, i + 1).join('.');
var parsedName;
try
{
parsedName = eval(ns.__typeName);
}
catch (e)
{
parsedName = null;
}
if (parsedName !== ns)
{
delete rootObject[currentPart];
throw Error.argument('namespacePath', Sys.Res.invalidNameSpace);
}
ns.getName = function ns$getName() { return this.__typeName; }
}
rootObject = ns;
}
}
发挥程序员“磨”的精神,把它代码删到仍然可以运行的地步,最后的结果只有两行:
var ns = window["ZU"] = {};
ns.__namespace = true;
最重要的也就是第二行:把__namespace属性设为true即可。但我没查到__namespace到底是何方属性。副产品,找到一个网页,作者也是指出要设__namespace的。
http://www.robrich.org/archive/2007/12/21/JavaScript-namespace.aspx
现在,我就可以方便地把自己的程序组形成一个命名空间,要做的,只是在var ZU = {};之后加一句:
ZU.__namespace = true;
这样VS环境就认为ZU为命名空间。不过,除了提示的符号不一样,其它的一点都没差别。