react-native-gp-utils
Version:
对react-native全局进行配置,对内置对象原型链增加方法,增加常用全局方法.
124 lines (113 loc) • 6.62 kB
JavaScript
import CommonUtils from './CommonUtils';
import MathUtils from './MathUtils';
import RNUtils from './RNUtils';
import ConfigUtils from './ConfigUtils';
import RegExpUtils from './RegExpUtils';
import RandomUtils from './RandomUtils';
// 内建对象部分
import ArrayUtils from './BuiltInObjectUtils/ArrayUtils';
import DateUtils from './BuiltInObjectUtils/DateUtils';
import NumberUtils from './BuiltInObjectUtils/NumberUtils';
import ObjectUtils from './BuiltInObjectUtils/ObjectUtils';
import StringUtils from './BuiltInObjectUtils/StringUtils';
// // 其他部分
import DebugUtils from './Others/DebugUtils';
import FileUtils from './Others/FileUtils';
const {loop}=CommonUtils.normal.funcs;
const BuiltInUtils={ArrayUtils,DateUtils,NumberUtils,ObjectUtils,StringUtils};
const Others={DebugUtils,FileUtils};
const allUtilsFiles={CommonUtils,MathUtils,RNUtils,RegExpUtils,RandomUtils,...BuiltInUtils,...Others};
//侵入式等级为1时用户要自定义名称时用的变量
let namesMap={};
//用户给出的全局配置
let configs={};
let Global={namesMap,configs};
//根据侵入式等级来决定如何处理,返回数据
/*
定义3种侵入式等级:
0:非侵入式
每个要用到的方法的文件中都要导入指定的工具类,并以`工具类.方法名`的方式调用方法.
优点:不会占用任何一个全局变量和任何一个内建对象(Array,String对象等)的prototype原型链属性,不会造成全局变量污染
缺点:每个要使用的文件都要导入相应的库文件,不方便
1:部分侵入式(推荐)
只用在入口文件中导入一次即可,并以`工具类.方法名`方式调用方法,内建对象以`arr.unshiftFromIndex`的形式调用.
优点:相对方便,只用入口文件导入一次,其他文件都可以使用.
缺点:会占用与各个工具类名相同的全局变量的属性(也可把各个工具类名定义为自定义的变量名),以及各个内建对象(Array,String对象等)的prototype原型链的与方法名相同的属性
2:完全侵入式
只用在入口文件中导入一次即可,并以`方法名`方式直接调用方法,内建对象以`arr.unshiftFromIndex`的形式调用.
优点:非常方便,在入口文件中导入一次即可,在任何地方使用任何方法,只用直接用方法名就可以调用方法.
缺点:会占据各个工具类中所有和方法名相同的全局变量(会造成全局变量污染),和各个内建对象(Array,String对象等)的prototype原型链的与方法名相同的属性
*/
const initWtihInvadeScale=function (invadeScale) {
ConfigUtils(Global.configs);
/*
根据是否有prototype原型链的方法分为4中方法类型:
1.normal:普通方法
2.onlyProto为只提供prototype原型链的方法
3.both为同时提供prototype原型链的方法和与之对应的方法
4.baseOnInvadeScale为依据侵入式等级来决定:侵入式为0时提供prototype原型链对应的方法,不为0时提供prototype原型链方法而不提供与之对应的方法
*/
//侵入式等级1,2时把方法加入到原型链的方法
const toProtoFunc=(UtilsName,UtilsData,UtilsTypeData,UtilsFuncType)=>{//UtilsName即k1,UtilsData即v1,UtilsTypeData即v2,funcType即方法类型k2
const objName=/^(.*)Utils$/.exec(UtilsName)[1]; //正则得出是哪个内建对象
let objProtoType=eval([objName,'.prototype'].join('')); //拼接出该内建对象的prototype(比如Array.prototype)
loop(UtilsTypeData.proto,(k,v)=>{objProtoType[k]=v}); //将其中的每一个方法加入到原型链中
delete UtilsTypeData.proto; //将转换到原型链上的原方法数据移除
UtilsFuncType!=='both'&&(delete UtilsData[UtilsFuncType]); //不是both时,并且有提供funcs普通方法时也移除
};
//侵入式等级0,1时把普通方法从funcs下抽到外层的方法
const pullFuncs=(UtilsName,UtilsData,UtilsFuncType,UtilsTypeData)=>{//UtilsName即k1,UtilsData即v1,UtilsFuncType即k2,UtilsTypeData即v2
loop(UtilsTypeData.funcs,(k3,v3)=>{UtilsData[k3]=v3}); //将这些方法从funcs下,移到v1这层
delete UtilsData[UtilsFuncType]; //将源数据UtilsData从中移除
// delete UtilsData; //这样语法错误,不允许这样删除
};
loop(allUtilsFiles,(k1,v1)=>{//k1为每个工具类名称,v1为存放该工具类所有属性,方法的对象
loop(v1,(k2,v2)=>{//k2为当前遍历到的工具类中的方法类型(normal,onlyProto...),v2为这个方法类型中有的方法.下面的k3,v3则是这些方法类型下的(funcs或proto)中的每个方法的方法名,方法体
if(invadeScale===0){
if(k2==='both'||k2==='baseOnInvadeScale'||k2==='normal'){
pullFuncs(k1,v1,k2,v2);
}
}
else if(invadeScale===2){
switch (k2){
case 'baseOnInvadeScale':
case 'onlyProto':
toProtoFunc(k1,v1,v2,k2);
break;
case 'both':
toProtoFunc(k1,v1,v2,k2);
case 'normal':
loop(v2.funcs,(k3,v3)=>{global[k3]=v3}); //将这些方法都加到全局变量中,键就是方法名,值就是方法体
v2.funcs&&(delete v2.funcs); //将both,normal转换到全局变量上的方法,从源数据中移除
break;
}
}else { //默认推荐使用侵入式1,所以不管用户输入1,还是除0,1,2之外的其他不合法的值都回到这里来
switch (k2){
case 'baseOnInvadeScale':
case 'onlyProto':
toProtoFunc(k1,v1,v2,k2);
break;
case 'both':
toProtoFunc(k1,v1,v2,k2);
case 'normal':
pullFuncs(k1,v1,k2,v2);
break;
}
}
})
});
// console.log(allUtilsFiles);
if(invadeScale===0){return allUtilsFiles}
if(invadeScale===1){
let {namesMap}=Global;
loop(allUtilsFiles,(k,v)=>{
if(namesMap[k]){
global[namesMap[k]]=v;
}else {
global[k]=v;
}
})
}
};
Global={...Global,initWtihInvadeScale,namesMap,...allUtilsFiles};
export default Global;