前言:据我所知,这个问题可能在互联网上的某个地方有答案,但我找不到一种方法来制定它,以便谷歌给我一个答案。
上下文: 我正在开展一个小项目,涉及在2D空间中移动的物体。每个对象都有一个位置,该位置包含在Vector2D对象中(具有x坐标,y坐标和与位置相关的一些其他逻辑位)。
现在,每当我想对这些物体进行任何类型的数学运算时(例如,移动一个物体),我必须用X轴和Y轴分离我的计算,这是一个巨大的痛苦。
关于问题:有没有办法在类之间实现运算符(例如'+'或'*'),所以不必为每个单独的变量编写单独的逻辑?如果是这样,那会是什么样的?
实施例: 我想将对象A 4个单元向右移动4个单元向下移动。
目前情况:
this.ObjectA.x + = 4;
This.objectA.y + = 4;
理想情况: this.ObjectA + = new Vector2D(4,4);
答案 0 :(得分:3)
简短回答:不,因为JavaScript不支持运营商重载。
到目前为止,TypeScript没有实现该功能,因为需要依赖于类型的发射 (见TypeScript/issues/5407)。
我们避免做的一件事是类型驱动的发射。我们的想法是,TypeScript类型在运行时没有任何影响 - 代码与您编写的类似JavaScript非常接近。鉴于此,在方法调用中替换运算符将违背该原则。
另一位TS维护者表示他们未能实现未通过ECMAScript提案流程的功能(请参阅TypeScript/issues/2319)。这背后的原因是为了避免可能的未来与官方ES语法的冲突。
在esdiscuss.org上有很多关于此功能的讨论(有些可追溯到11年前......)。在one of the most recent中,发表了以下评论:
我建议放弃任意类型的操作符重载的所有想法 - 这种情况极不可能发生。它严重影响了优化的可能性,需要进行广泛的类型检查。此外,浏览器供应商没有兴趣实现它。
因此,运算符重载似乎极不可能将其转换为ECMAScript 。
在类上实现一个函数:)由于运算符重载只是一个语法糖,你可以通过函数调用实现相同的功能。所以不要这样:
this.ObjectA += new Vector2D(4,4);
这样做:
this.ObjectA.addVector(new Vector2D(4,4));
答案 1 :(得分:1)
听起来你需要类似“add”方法的东西。
以下是Playground site上的此行为示例。
以下是代码本身:
class Point {
x: number;
y: number;
constructor(x?: number, y?: number) {
this.x = x ? x : 0;
this.y = y ? y : 0;
}
add(value: Point): void {
this.x += value.x;
this.y += value.y;
}
}
class MovingAroundObject {
position: Point = new Point();
}
const movingObject = new MovingAroundObject();
alert("movingObject.position.x: " + movingObject.position.x + " | movingObject.position.y: " + movingObject.position.y);
// A value to change position of the object
const changePosition = new Point(4, 5);
// Change the position of the object
movingObject.position.add(changePosition);
alert("movingObject.position.x: " + movingObject.position.x + " | movingObject.position.y: " + movingObject.position.y);
// Change the position of the object again
movingObject.position.add(changePosition);
alert("movingObject.position.x: " + movingObject.position.x + " | movingObject.position.y: " + movingObject.position.y);