我可以在Javascript中定义自定义运算符重载吗?

pim*_*vdb 26 javascript dsl equality vector operator-overloading

是否可以在JavaScript中的类型实例之间定义自定义运算符?

例如,假设我有自定义矢量类,是否可以使用

vect1 == vect2
Run Code Online (Sandbox Code Playgroud)

检查是否相等,而底层代码是这样的?

operator ==(a, b) {
    return a.x == b.x && a.y == b.y && a.z == b.z;
}
Run Code Online (Sandbox Code Playgroud)

(当然这是无稽之谈.)

mck*_*oss 9

我同意矢量原型上的相同功能是最佳解决方案.请注意,您还可以通过链接构建其他类似中缀的运算符.

function Vector(x, y, z) {
    this.x = x;
    this.y = y;
    this.z = z;
}

Vector.prototype.add = function (v2) {
    var v = new Vector(this.x + v2.x,
                       this.y + v2.y,
                       this.z + v2.z);
    return v;
}

Vector.prototype.equal = function (v2) {
    return this.x == v2.x && this.y == v2.y && this.z == v2.z;
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到在线样本.

更新:这是创建支持链接的Factory功能的更广泛示例.


Gum*_*mbo 8

不,JavaScript不支持运算符重载.您需要编写一个执行此操作的方法:

Vector.prototype.equalTo = function(other) {
    if (!(other instanceof Vector)) return false;
    return a.x == b.x && a.y == b.y && a.z == b.z;
}
Run Code Online (Sandbox Code Playgroud)

然后您可以使用以下方法:

vect1.equalTo(vect2)
Run Code Online (Sandbox Code Playgroud)


gbl*_*zex 8

如果你想坚持==运营商,你可以做的最好的事情:

function Vector(x, y, z) {
  this.x = x;
  this.y = y;
  this.z = z;
}

Vector.prototype.toString = function () {
  return this.x + ";" + this.y + ";" + this.z;
};

var a = new Vector(1, 2, 3);
var b = new Vector(1, 2, 3);
var c = new Vector(4, 5, 6);


alert( String(a) == b ); // true
alert( String(a) == c ); // false
alert( a == b + "" );    // true again (no object wrapper but a bit more ugly)
Run Code Online (Sandbox Code Playgroud)


mik*_*iku 5

不,它不是规范的一部分(这并不意味着没有一些 hacks)。

  • 我真的希望这个链接仍然有效 (3认同)