我们现在已经加上了类型判断,通过传入的参数类型与个数的不同,能够相应的去执行对应的函数,其实参数的顺序一个道理,也是支持的 。
类型扩展上面的类型约定我们可能看起来怪怪的,而且比较难以理解,因此我们可以扩展一下类型约定的表示方式,改造后的Overload函数如下:
function Overload(defaultCall) {let func = defaultCall || new Function()func.overloadCached = []func.modifier = []return new Proxy(func, {get(target, property, receiver) {if(property !== 'load') {if(property.indexOf(',') !== -1) {property.split(',').map(item => {target.modifier.push(item)})}else{property.split('').map(item => {target.modifier.push(item)})}}return receiver},set(target, prop, value) {let modi = nullif(prop.indexOf(',') !== -1) {modi = prop.split(',')}else{modi = prop.split('')}if(modi.every(p => {return ['n','s','b','o','a','d','S','r','B','f','number','string','boolean','object','array','date','Symbol','regexp','bigint','function'].includes(p)})) {modi.map(item => {target.modifier.push(item)})}if(prop === 'load' || target.modifier.length !== 0) {let str = value.toString()let m1 = str.match(/(.+?)/)if(m1 && m1[0].indexOf("...") != -1) {value.rest = true}value.modifier = target.modifiertarget.overloadCached.push(value)target.modifier = []}},apply(target, thisArg, argumentsList) {for(let i = target.overloadCached.length - 1; i > -1; i--) {if((argumentsList.length === target.overloadCached[i].length) || (target.overloadCached[i].rest && argumentsList.length > target.overloadCached[i].length)) {if(target.overloadCached[i].modifier.length !== 0){let ty = {'[object Number]': ['n','number'],'[object String]': ['s','string'],'[object Boolean]': ['b','boolean'],'[object Object]': ['o','object'],'[object Array]': ['a','array'],'[object Date]': ['d','date'],'[object Symbol]': ['S','Symbol'],'[object Regexp]': ['r','regexp'],'[object BigInt]': ['B','bigint'],'[object Function]': ['f','function'],}if(target.overloadCached[i].modifier.some((m, j) => {return !ty[({}).__proto__.toString.call(argumentsList[j])].includes(m)})) {continue}}return target.overloadCached[i].apply(thisArg, argumentsList)}}return target.apply(thisArg, argumentsList)}})}
这样我们就可以支持一下几种类型约定的书写形式:
sum.load.s.n.n = function (a, b, c) {return a + (b + c) * 0.85;}sum.load['snn'] = function (a, b, c) {return a + (b + c) * 0.85;}sum.load.snn = function (a, b, c) {return a + (b + c) * 0.85;}//对于全称不能够写成.(点)的形式sum.load['string,number,number'] = function (a, b, c) {return a + (b + c) * 0.85;}//这四种形式的任意一种对于console.log(sum('$', 280, 190));//都会输出:$399.5
到此为止,我们已经能够支持参数的个数、类型、顺序的不同,会执行不同的处理函数,满足了重载的基本需求,完成了我们在最开始的需求假设的实现 。
结语目前这种方式只能支持函数表达式的方式来进行重载,这里只是给大家提供一个自定义实现重载的方式,结合自己的业务场景,小伙伴们可以自由发挥,其实目前js的既有方式能满足我们需要重载的场景,而不需要额外设计重载的代码 。
具体这种方式的优劣,大家可以自行判断,并且可以根据这种思路重新设计一下实现的手段 。
推荐阅读
- 文玩|翡翠当中的瑕疵,你都了解多少呢?按照严重程度来分辨是否要买
- 良渚文化|徐梦梅——良渚"玉石文"是殷墟甲骨文之祖
- 5个让人爱不释手的微信小程序,每一款都是精品中的精品
- 瑶医望诊绝技——观目诊病 瑶医目诊
- 星象|星象|Alex大叔 一周宇宙星象播报(8.22—8.28)
- 翡翠手镯|翡翠玉雕中的巧色,分色,俏色你分清楚了吗
- 雕刻|【臻曦文化】瓷器上的艺术手段—雕刻瓷
- 国画技法——山水的几种画法 国画山水技法
- 5岁儿童数学启蒙 生活中的数
- 鸡胸肉|多种类型男生眼中的心动发型