javascript在语言上的灵活性导致了javascript脚本一直以来很难被复用,但笔者认为这并不完全是javascript自身的问题,web开发人员在开发中没有遵循一定的规范也是很重要的原因,当然为javascript制定一个公认的完整的规范几乎是不可能的,不过在面向对象这个特定的领域,制定一个相对可用的规范是可以的。
对于笔者制定的以下规范,有几点需要说明:首先,为了避免对象间可能出现的交叉影响,不引入继承的概念;其次,为了降低规范的复杂性,不使用包导入的方法引用类库,而保留html标记引用的方法。
//根命名空间和子命名空间var figcn={};//重复定义命名空间会清空该命名空间内的所有代码,所以根命名空间的命名最好跟公司或项目代号相关,最好不要使用com、cn等命名,这跟java的包命名方式是有区别的。
figcn.io={};
//类
figcn.util=function(){};
//带构造函数的类
figcn.util=function()
{
if(arguments.length==0)
this.name="default";
else
this.name=arguments[0];
};
//类的静态字段
figcn.util.name="figcn.util";
//类的静态函数
figcn.util.showmsg=function(){alert(arguments[0]);};
//类的成员字段
figcn.util.prototype.classname="util";//可以在类的成员函数中以this.classname引用
figcn.util.prototype.namespace="figcn";
//类的成员函数
figcn.util.prototype.getFullName=function()
{
return this.namespace+"."+this.classname;
};
figcn.util.prototype.showFullName=function()
{
alert(this.getFullName());
};
//实例化类
var ut=new figcn.util();
//调用类的成员函数
ut.showFullName();
//引用类的成员字段
alert(ut.classname);
alert(ut.name);
//调用类的静态函数
figcn.util.showmsg("ut.showmsg");
//引用类的静态字段
alert(figcn.util.name);
附录:javascript代码调试器
jsDebugger.hta
<html>
<title>JavaScript Debug Tool</title>
<script src="figcn.js"></script>
<script src="figcn.io.js"></script>
<body>
<div>
<input type=button value=Run οnclick="run()">
<input type=button value=Refresh οnclick="location.reload()">
<input type=button value=Save οnclick="save()">
<input type=file οnchange="loadfile(this.value)" name=f>
<span id=spanx></span>
</div>
<div>
<textarea cols=100 rows=40 id=txt></textarea>
</div>
<script>
function run()
{
eval(document.all.txt.value);
}
function save()
{
document.all.spanx.innerText="Saving...";
if(document.all.f.value=="")
figcn.io.File.save(document.all.txt.value,figcn.DateTime.toString()+".txt");
else
figcn.io.File.save(document.all.txt.value,document.all.f.value);
document.all.spanx.innerText="Saved.";
}
function loadfile(path)
{
document.all.txt.value=figcn.io.File.load(path);
}
</script>
</body>
</html>
引用文件一:
figcn.js
var figcn={};
//----DateTime类----------------
figcn.DateTime=function(){};
figcn.DateTime.toString=function()
{
var d=new Date();
var year=d.getYear();
var month=d.getMonth()+1;if(month<10) month = "0" +month;
var day =d.getDate();if(day<10)day="0"+day;
var hour=d.getHours();if(hour<10) hour="0"+hour;
var minute=d.getMinutes();if(minute<10) minute ="0" +minute;
var second=d.getSeconds();if(second<10) second ="0" +second;
var x=year+month+day+hour+minute+second;
return x;
}
引用文件二:
figcn.io.js
figcn.io={};
//----File类----------------
figcn.io.File=function(){};
figcn.io.File.load=function(path)
{
var fso, oTextStream,s;
var ForReading = 1;
fso = new ActiveXObject("Scripting.FileSystemObject");
oTextStream = fso.OpenTextFile(path, ForReading);
s=oTextStream.ReadAll();
oTextStream.Close();
oTextStream=null;
fso=null;
return s;
};
figcn.io.File.save=function(txt,path)
{
var fso, tf;
fso = new ActiveXObject("Scripting.FileSystemObject");
tf = fso.CreateTextFile(path, true);
tf.Write(txt) ;
tf.Close();
};