# Javascript运算符重载
**Repository Path**: djxfire/javascript_operator_overloading
## Basic Information
- **Project Name**: Javascript运算符重载
- **Description**: javascript实现运算符重载功能
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 3
- **Created**: 2018-03-05
- **Last Updated**: 2021-07-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Javascript运算符重载
javascript实现运算符重载功能
- 这里是列表文本重载的运算符:
+、-、*、/、%、**
- 这里是列表文本这里是列表文本需要类实现静态方法:
```
__add__、__plus__、__multiply__、__divide__、__mod__、__power__
```
### 项目简介
javascript一切皆对象的概念深入人心,但是它的运算符却只能应用于数值型和字符串,显得一切皆对象有点鸡肋。项目通过向javascript脚本代码的表达式注入__replace__方法实现对象运算符的重载。
### 用法
1. 通过script标签编写okayscript代码,okayscript作为代码容器,可被OOkay提取编译执行,例如
```
Title
```
在okayscript代码中,对象便可以使用运算符操作,运算符重载方法需要在类定义中指定静态__**__方法,如上例中的Point需要加法运算,我们需要重载—__add__方法,代码如下:
```
class Point {
constructor (x, y) {
this.x = x
this.y = y
}
static __add__(p1, p2) {
return new Point(p1.x + p2.x, p1.y + p2.y)
}
}
```
2. 除了在okayscript中编写代码实现对象运算,还可以调用OOkay.__$__方法对需要对象运算的代码进行编译,例如:
```
Title
```
3. 以上两点本质上是对代码块的编译,假如有一下场景:我们定义一个Rectangle类,Rectangle类的方法中需要进行运算符操作,就不能像上述方法手动将代码块提交给OOkay进行编译,我们的解决方案是让该类继承自OOKay类,例如:
```
class Rectangle extends OOkay {
constructor (){
super()
this.left_top = new Point(0, 0)
this.right_bottom = new Point(1, 1)
}
width () {
let p3 = this.right_bottom - this.left_top
return p3.x
}
height () {
let p3 = this.right_bottom - this.left_top
return p3.y
}
}
```
Rectangle类继承自OOkay,Rectangle的width与height使用了Point的加法运算和减法运算,在其他地方就可以随意编写javascript,而无需再向OOkay提交代码编译了,例如:
```
Title
```
4. 第三点要求类必须是OOkay的对象,对于根类(最开始的类)不是OOkay的不适用,例如我们想要继承自Map类,显然不能修改Map类。我们可以在类构造器中OOkay.inject方法将对象提交给我们的OOkay进行编译,如上例可以修改为:
```
class Rectangle {
constructor (){
OOkay.inject(this)
this.left_top = new Point(0, 0)
this.right_bottom = new Point(1, 1)
}
width () {
let p3 = this.right_bottom - this.left_top
return p3.x
}
height () {
let p3 = this.right_bottom - this.left_top
return p3.y
}
}
```
Rectange类无需继承自OOkay,只需在构造器中添加OOkay.inject(this)即可
5. 我们还可以通过修饰器进行注入编译,例如:
```
@inject('class')
class Rectangle{
constructor (){
this.left_top = new Point(0, 0)
this.right_bottom = new Point(1, 1)
}
width () {
let p3 = this.right_bottom - this.left_top
return p3.x
}
height () {
let p3 = this.right_bottom - this.left_top
return p3.y
}
}
```
通过@inject('class')对类进行修饰,也可以通过@inject('method')对方法进行修饰,从而无需编译整个类,例如:
```
class Rectangle{
constructor (){
this.left_top = new Point(0, 0)
this.right_bottom = new Point(1, 1)
}
@inject('method')
width () {
let p3 = this.right_bottom - this.left_top
return p3.x
}
@inject('method')
height () {
let p3 = this.right_bottom - this.left_top
return p3.y
}
draw () {
}
}
```
例子中width方法与height方法将被重新编译成okayscript,而draw方法不会