Javascript面向对象扩展库代码分享
2024-05-06 14:22:14
供稿:网友
lang.js库提供了包和类的定义、类的继承与混合(mixin)、函数重载等功能,基本可满足大多数面向对象设计的需求。同时支持基于链式的定义方式,让库在使用时更加规范和便捷。下面首先通过简单的例子演示了lang.js的基本功能,之后给出了lang.js的源码及注释。
一.功能介绍
“lang”作为框架的全局定义,其中包括了四个方法:
lang.Package(string name) //用于定义包(默认会暴露到全局)
lang.Class(string name[, object config], object classBody) //用于定义类
lang.Object(string name | object body) //用于定义支持重载函数的普通对象
lang.Function(string name | object body) //用于定义重载函数
代码如下:
var lang = (function(){
/***********************************
Javascript面向对象扩展库(lang.js v1.0)
By: X!ao_f
QQ: 120000512
Mail: xiao_f.mail#163.com
************************************/
var customToString = function(){
return '[' + this.Type.type + ' ' + this.Type.name + ']';
}
//支持重载的方法定义
var createMethod = (function(){
//创建一个代理函数
var createMethodProxy = function(context, name){
//当调用重载的函数时,首先会执行该函数分析传入的参数,进行匹配和转发
var method = function(){
//在第一次调用时初始化,将映射信息缓存
if(!method.__initialized__){
initializeMethod(method);
}
//将参数类型拼接成函数签名
var signature;
if(arguments.length){
var list = [];
for(var i=0; i<arguments.length; i++){
var typename;
var argument = arguments[i];
if(argument === undefined || argument === null){
typename = 'object';
}else if(argument instanceof Array){
typename = 'array';
}else if(argument instanceof Date){
typename = 'date';
}else{
typename = typeof argument;
if(typename == 'object'){
if('Class' in argument){
typename = argument.Class.Type.name;
}else if('nodeType' in argument){
typename = 'element';
}
}
}
list.push(typename);
}
signature = list.join(',');
}else{
signature = '';
}
//如果常规缓存中存在匹配的签名,直接调用
if(method.__overloads__[signature]){
return method.__overloads__[signature].apply(this, arguments);
}else{
//缓存中不存在时,尝试利用正则进行模糊匹配
//首先判断模糊匹配缓存中是否存在记录,如存在直接调用
if(method.__overloadsCache__[signature]){
return method.__overloadsCache__[signature].apply(this, arguments);
}
//循环匹配
for(var i=0; i<method.__overloadsRegExp__.length; i++){
//如果匹配成功,将映射关系存入模糊匹配缓存,同时调用并返回
if(method.__overloadsRegExp__[i].regexp.test(signature)){
method.__overloadsCache__[signature] = method.__overloadsRegExp__[i].fn;
return method.__overloadsRegExp__[i].fn.apply(this, arguments);