Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Typescript中实现同一类的两个对象之间的加法_Javascript_Oop_Typescript_Operator Overloading - Fatal编程技术网

Javascript 在Typescript中实现同一类的两个对象之间的加法

Javascript 在Typescript中实现同一类的两个对象之间的加法,javascript,oop,typescript,operator-overloading,Javascript,Oop,Typescript,Operator Overloading,前言:我知道这个问题可能在互联网上的某个地方有答案,但我找不到一种方式来表述它,以至于谷歌给了我一个答案 背景: 我正在做一个小项目,涉及在二维空间中移动的对象。这些对象中的每一个都有一个位置,该位置包含在矢量2D对象中。2D对象有一个x坐标、y坐标和一些其他与位置相关的逻辑位 现在,每当我想对这些物体进行任何形式的数学运算,比如说,移动一个物体,我就必须通过X轴和Y轴来分离我的计算,这是一个巨大的痛苦 关于这个问题:是否有某种方法可以在类之间实现诸如“+”或“*”之类的运算符,从而不必为每个单

前言:我知道这个问题可能在互联网上的某个地方有答案,但我找不到一种方式来表述它,以至于谷歌给了我一个答案

背景: 我正在做一个小项目,涉及在二维空间中移动的对象。这些对象中的每一个都有一个位置,该位置包含在矢量2D对象中。2D对象有一个x坐标、y坐标和一些其他与位置相关的逻辑位

现在,每当我想对这些物体进行任何形式的数学运算,比如说,移动一个物体,我就必须通过X轴和Y轴来分离我的计算,这是一个巨大的痛苦

关于这个问题:是否有某种方法可以在类之间实现诸如“+”或“*”之类的运算符,从而不必为每个单独的变量编写单独的逻辑?如果是这样,那是什么样子

例如: 我想将对象A向右移动4个单位,向下移动4个单位

当前情况:

this.ObjectA.x+=4

This.objectA.y+=4

理想情况:
this.ObjectA+=新向量2d4,4

听起来您需要类似于add方法的东西

下面是一个关于此行为的示例

以下是代码本身:

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);

简短回答:不,因为JavaScript不支持运算符重载

打字稿问题 到目前为止,TypeScript没有实现该功能,因为这需要依赖于类型的发射 看

我们避免做的一件事是类型驱动的emit。其思想是,TypeScript类型在运行时没有关系——代码与您编写的类似JavaScript非常接近。考虑到这一点,在方法调用中替换运算符将与此背道而驰

另一位TS维护人员表示,他们不会实现没有经过ECMAScript建议过程的功能。这背后的原因是为了避免将来可能与官方ES语法发生冲突

ECMAScript 在一些11年前的网站上,有很多关于这个功能的讨论…。在以下评论中:

我建议放弃对任意类型的运算符重载的所有想法-这是极不可能发生的。它严重影响优化的可能性,需要大量的类型检查。此外,浏览器供应商对实现它没有兴趣

因此,操作符重载似乎不太可能使它成为ECMAScript

我该怎么办… 在类上实现一个函数:因为操作符重载只是一种语法糖分,所以可以通过函数调用实现同样的效果。因此,与此相反:

this.ObjectA += new Vector2D(4,4);
这样做:

this.ObjectA.addVector(new Vector2D(4,4));

@migajek的可能重复可以被视为重复,是的。@Valthek如果你觉得有帮助,你应该把其中一个答案标记为正确:@MichałMiszczyszyn我给了它整整24小时的时间,以防地球另一边的人有兴趣回答。随着时间的流逝,我将继续这样做。