Namespace = new Object();
Namespace.register = function(fullNS)
{
// 将命名空间切成N部分, 比如Grandsoft、GEA等
var nsArray = fullNS.split('.');
var sEval = "";
var sNS = "";
for (var i = 0; i < nsArray.length; i++)
{
if (i != 0) sNS += ".";
sNS += nsArray[i];
// 依次创建构造命名空间对象(假如不存在的话)的语句
// 比如先创建Grandsoft,然后创建Grandsoft.GEA,依次下去
sEval += "if (typeof(" + sNS + ") == 'undefined') " + sNS + " = new Object();"
}
if (sEval != "") eval(sEval);
}
上面就是在JavaScript中模拟命名空间机制的完整实现,使用方式如下:
// 注册命名空间Grandsoft.GEA, Grandsoft.GCM
Namespace.register("Grandsoft.GEA");
Namespace.register("Grandsoft.GCM");
Grandsoft.GEA.Person = function(name, age)
{
this.name = name;
this.age = age;
}
Grandsoft.GEA.Person.prototype.show = function()
{
alert(this.name + " is " + this.age + " years old!");
}
var p = new Grandsoft.GEA.Person("yanglf", 25);
p.show();
没有框架的程序,像是刀耕火种,杂乱无章仅可果腹;
使用框架的程序,就像种田,尽管单一,效益却不错;
那么写框架,则就是开荒了。呵呵....
人类,也就是这么走过来的。
关于JavaScript 的框架,网上似乎不大多,最知名的,也就是个EXT了,很不错,华丽,强大,不过学着用点麻烦;宁愿自己写一个,写了N天,实在头痛,N多内容,的确工作量不小,做下整理....
首选,做个广告,把这段时间对我帮助很大的几个网站公布如下:
http://www.w3school.com.cn/ 纯中文,对WEB标准的模型和参考文档都很全;数据量不大,却很精准的。
http://developer.mozilla.org/ 纯英文,Mozilla 开发人员中心,为了兼容,英文也啃了。
http://msdn.microsoft.com/ 中英参半,著名的独裁者微软的开发人员网络;
至于百度,Google等,提名即可,以下进入正题。
我的 xSystem 的测试版就要出炉了,按照版本规则和服务器上的号码显示,当前应该称呼它为 xSystem Framework 1.0.28 beta 尽管它小的可怜;也有不少 BUG;呵呵...
要解决的第一个问题,关于命称空间(namespace)或叫包(package)结构;
坦白讲,JavaScript 并不是一个完整的面像对像的语言,所谓的JavaScript 面像对像,不过是以面向对像的思想,以另外的手段去模拟;写习惯了java等语言的程序员,很习惯于这样的写法:
new a().b.c().d(e).f.g();
有些夸张,但是却是事实;我们要做的就是找到一种类似的方法,并非为了解决习惯问题,而是解决大量代码封装时面临的变量名等冲突和代码组织管理等问题。
郭熟悉JavaScript 中的人,都知道 javascript中对像的一大特点,几乎即任何时候,都可以向一个对像添加属性和方法;
如:
function ClassA(){} // 声明一个类 ClassA;
var objA = new ClassA(); // 创建一个类的实例. objA;
objA.name = "classA"; // 为 对像 objA 添加name属性;
WScript.Echo(objA.name); // 打出添加的objA的name属性
复杂一点若name也是一个对像:
function name(){
// 把名子拆成姓和名两部分;
this.firstname = "class";?
this.lastname = "A";
function getfullName(){
return this.firstname + this.lastname;
}
this.getfullName = getfullName;
}
var objB = new ClassA();
objB.name = new name();
WScript.Echo(objB.name.getfullName());
我需要更简单的写法:
我们实现了我们所需要的,但是的确这种写法又臭又长,况且我们并不需要反复的声明对像,然后反复的实例化他们,古怪的javaScript为我们提供了不写构造函数,而直接写出对像的方法即 {} 花括号;
简单的写法:
var ObjC = {name:{firstname:"Class",lastname:"A",getfullName:function(){return this.firstname+this.lastname}}}
WScript.Echo(objC.name.getfullName());
以上,即是名称空间的实现方法,即利用javascript对像的扩展性,对像的属性是一个对像,属性的属性还是一个对像;以此类推去构建我们所需要的结果:
一段完整的例子:
// 声明框架根空间对像
var xSystem = {author:"戏得散人",blog:"http://shizhong8841.blog.163.com"};
// 提供空间内的全局堆栈;
xSystem.globle = {};
// 为 globle 添加 get 和set 方法, value 可以是任意类型的对像;
xSystem.set = function(name,value){
xSystem.globle[name]=value;
}
// 根据名字返回globle空间中的对像;
xSystem.get = function(name){
return xSystem.globle[name];
}
// 把globle空间中的一个对像置空并删除;
xSystem.setNull = function(name){
xSystem.globle[name] = null;
delete(xSystem. globle[name]);
}
xSystem.set("key",100);
alert(xSystem.get("key"));
xSystem.setNull("key");
alert(xSystem.get("key"));
浙公网安备 33010602011771号