首页 > 语言 > JavaScript > 正文

Javascript实现运算符重载详解

2024-05-06 15:20:08
字体:
来源:转载
供稿:网友

最近要做数据处理,自定义了一些数据结构,比如Mat,Vector,Point之类的,对于加减乘除之类的四则运算还要重复定义,代码显得不是很直观,javascript没有运算符重载这个像C++、C#之类的功能的确令人不爽,于是想“曲线救国”,自动将翻译代码实现运算符重载,实现思路其实很简单,就是编写一个解释器,将代码编译。例如:

S = A + B (B - C.fun())/2 + D

翻译成

`S = replace(replace(A, '+', replace(replace(B,'',(replace(B,'-',C.fun())))),'/',2),'+',D)`

在replace函数中我们调用对象相应的运算符函数,replace函数代码如下:

/** * 转换方法 * @param a * @param op * @param b * @returns {*} * @private */export function __replace__(a,op,b){  if(typeof(a) != 'object' && typeof(b) != 'object'){    return new Function('a','b','return a' + op + 'b')(a,b)  }  if(!Object.getPrototypeOf(a).isPrototypeOf(b)    && Object.getPrototypeOf(b).isPrototypeOf(a)){    throw '不同类型的对象不能使用四则运算'  }  let target = null  if (Object.getPrototypeOf(a).isPrototypeOf(b)) {    target = new Function('return ' + b.__proto__.constructor.name)()  }  if (Object.getPrototypeOf(b).isPrototypeOf(a)) {    target = new Function('return ' + a.__proto__.constructor.name)()  }  if (op == '+') {    if (target.__add__ != undefined) {      return target.__add__(a, b)    }else {      throw target.toString() +'/n未定义__add__方法'    }  }else if(op == '-') {    if (target.__plus__ != undefined) {      return target.__plus__(a, b)    }else {      throw target.toString() + '/n未定义__plus__方法'    }  }else if(op == '*') {    if (target.__multiply__ != undefined) {      return target.__multiply__(a, b)    }else {      throw target.toString() + '/n未定义__multiply__方法'    }  } else if (op == '/') {    if (target.__divide__ != undefined) {      return target.__divide__(a, b)    }else {      throw target.toString() + '/n未定义__divide__方法'    }  } else if (op == '%') {    if (target.__mod__ != undefined) {      return target.__mod__(a, b)    }else {      throw target.toString() + '/n未定义__mod__方法'    }  } else if(op == '.*') {    if (target.__dot_multiply__ != undefined) {      return target.__dot_multiply__(a, b)    }else {      throw target.toString() + '/n未定义__dot_multiply__方法'    }  } else if(op == './') {    if (target.__dot_divide__ != undefined) {      return target.__dot_divide__(a, b)    }else {      throw target.toString() + '/n未定义__dot_divide__方法'    }  } else if(op == '**') {    if (target.__power__ != undefined) {      return target.__power__(a, b)    }else {      throw target.toString() + '/n未定义__power__方法'    }  }else {    throw op + '运算符无法识别'  }}

replace实现非常简单,不做过多解释,重要的部分是如何实现代码的编译。大学学习数据结构时四则运算的实现就是这翻译的基础,略微有些差异。简单描述一下流程:

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选