Javascript面向?qū)ο髷U(kuò)展庫代碼分享
2024-05-06 14:22:14
供稿:網(wǎng)友
lang.js庫提供了包和類的定義、類的繼承與混合(mixin)、函數(shù)重載等功能,基本可滿足大多數(shù)面向?qū)ο笤O(shè)計(jì)的需求。同時(shí)支持基于鏈?zhǔn)降亩x方式,讓庫在使用時(shí)更加規(guī)范和便捷。下面首先通過簡(jiǎn)單的例子演示了lang.js的基本功能,之后給出了lang.js的源碼及注釋。
一.功能介紹
“l(fā)ang”作為框架的全局定義,其中包括了四個(gè)方法:
lang.Package(string name) //用于定義包(默認(rèn)會(huì)暴露到全局)
lang.Class(string name[, object config], object classBody) //用于定義類
lang.Object(string name | object body) //用于定義支持重載函數(shù)的普通對(duì)象
lang.Function(string name | object body) //用于定義重載函數(shù)
代碼如下:
var lang = (function(){
/***********************************
Javascript面向?qū)ο髷U(kuò)展庫(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(){
//創(chuàng)建一個(gè)代理函數(shù)
var createMethodProxy = function(context, name){
//當(dāng)調(diào)用重載的函數(shù)時(shí),首先會(huì)執(zhí)行該函數(shù)分析傳入的參數(shù),進(jìn)行匹配和轉(zhuǎn)發(fā)
var method = function(){
//在第一次調(diào)用時(shí)初始化,將映射信息緩存
if(!method.__initialized__){
initializeMethod(method);
}
//將參數(shù)類型拼接成函數(shù)簽名
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 = '';
}
//如果常規(guī)緩存中存在匹配的簽名,直接調(diào)用
if(method.__overloads__[signature]){
return method.__overloads__[signature].apply(this, arguments);
}else{
//緩存中不存在時(shí),嘗試?yán)谜齽t進(jìn)行模糊匹配
//首先判斷模糊匹配緩存中是否存在記錄,如存在直接調(diào)用
if(method.__overloadsCache__[signature]){
return method.__overloadsCache__[signature].apply(this, arguments);
}
//循環(huán)匹配
for(var i=0; i<method.__overloadsRegExp__.length; i++){
//如果匹配成功,將映射關(guān)系存入模糊匹配緩存,同時(shí)調(diào)用并返回
if(method.__overloadsRegExp__[i].regexp.test(signature)){
method.__overloadsCache__[signature] = method.__overloadsRegExp__[i].fn;
return method.__overloadsRegExp__[i].fn.apply(this, arguments);