javascript package的一种简单"优雅"实现
命名空间(namespace)是一种很常用的管理各种类的方式,javascript的目前版本还没有原生态地实现这个功能,只能去手动模拟一下,代码如下:
var $package=function(ns,clzName,clz){
var defineNamespace=function(root,ns){
ns=ns || "";
ns=ns.replace(/\s/g,"");
if (ns.length == 0) {
return root;
}else {
var nsc = ns.substr(0, 1);
if (nsc != nsc.toLowerCase()) {
throw new Error("命名空间首字母必须小写哦~");
}
if (ns.indexOf(".") == -1) {
typeof(root[ns]) != "object" && (root[ns] = {});
return root[ns];
}
else {
var _ns = ns.split(".")[0];
typeof(root[_ns]) != "object" && (root[_ns] = {});
return defineNamespace(root[_ns], ns.replace(/[^\.]*\./, ""));
}
}
},
c=clzName.substr(0,1);
if(c!=c.toUpperCase()){
throw new Error("类名首字母必须大写哦~");
}
defineNamespace(window,ns)[clzName]=clz;
};
var defineNamespace=function(root,ns){
ns=ns || "";
ns=ns.replace(/\s/g,"");
if (ns.length == 0) {
return root;
}else {
var nsc = ns.substr(0, 1);
if (nsc != nsc.toLowerCase()) {
throw new Error("命名空间首字母必须小写哦~");
}
if (ns.indexOf(".") == -1) {
typeof(root[ns]) != "object" && (root[ns] = {});
return root[ns];
}
else {
var _ns = ns.split(".")[0];
typeof(root[_ns]) != "object" && (root[_ns] = {});
return defineNamespace(root[_ns], ns.replace(/[^\.]*\./, ""));
}
}
},
c=clzName.substr(0,1);
if(c!=c.toUpperCase()){
throw new Error("类名首字母必须大写哦~");
}
defineNamespace(window,ns)[clzName]=clz;
};
现在就可以用package的方式申明了:
$package("common.app.test","Point",function(x,y){
this.x= x || 0;
this.y= y || 0;
});
this.x= x || 0;
this.y= y || 0;
});
这样就可以用namespace+classname的方式来实例化对象了:
var p=new common.app.test.Point(1,2);
alert(p.constructor===common.app.test.Point);
alert(p.x);
alert(p.y);
alert(p.constructor===common.app.test.Point);
alert(p.x);
alert(p.y);
不过目前还没有考虑好怎样才能优雅地解决import namespace的问题,要么在使用类的时候,直接用绝对路径,要么就用个中转的变量引用,如:
var Point=common.app.test.Point;
var p=new Point(1,2);
alert(p.constructor===common.app.test.Point);
alert(p.x);
alert(p.y);
var p=new Point(1,2);
alert(p.constructor===common.app.test.Point);
alert(p.x);
alert(p.y);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器