代码拉取完成,页面将自动刷新
同步操作将从 janwool/Javascript运算符重载 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
javascript实现运算符重载功能
__add__、__plus__、__multiply__、__divide__、__mod__、__power__
javascript一切皆对象的概念深入人心,但是它的运算符却只能应用于数值型和字符串,显得一切皆对象有点鸡肋。项目通过向javascript脚本代码的表达式注入__replace__方法实现对象运算符的重载。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
<script type="text/javascript" src = "../../dist/ookay.js"></script>
<script type="text/javascript" src = "Point.js"></script>
<script type="text/okayscript">
let p1 = new Point(2, 2)
let p2 = new Point(3,1)
let p3 = p1 + p2
console.log('(x, y) of p3 :(' + p3.x + ',' + p3.y + ')')
</script>
</html>
在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)
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
<script type="text/javascript" src = "../../dist/ookay.js"></script>
<script type="text/javascript" src = "Point.js"></script>
<script>
OOkay.__$__(function(){
let p1 = new Point(2, 2)
let p2 = new Point(3,1)
let p3 = p1 + p2
console.log('(x, y) of p3 :(' + p3.x + ',' + p3.y + ')')
})
</script>
</html>
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提交代码编译了,例如:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
<script type="text/javascript" src = "../../dist/ookay.js"></script>
<script type="text/javascript" src = "Point.js"></script>
<script type="text/javascript" src = "Rectangle.js"></script>
<script>
let rect = new Rectangle()
console.log(rect.width()) // 1
console.log(rect.height()) // 1
</script>
</html>
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方法不会
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。