小编典典

Javascript:运算符重载

javascript

我已经使用JavaScript了几天,现在我想为定义的对象重载运算符。

在Google搜索了一段时间后,您似乎无法正式执行此操作,但是仍有一些人声称采取了一些漫长的方法来执行此操作。

基本上,我制作了Vector2类,并希望能够执行以下操作:

var x = new Vector2(10,10);
var y = new Vector2(10,10);

x += y; //This does not result in x being a vector with 20,20 as its x & y values.

相反,我必须这样做:

var x = new Vector2(10,10);
var y = new Vector2(10,10);

x = x.add(y); //This results in x being a vector with 20,20 as its x & y values.

我可以采用什么方法在Vector2类中重载运算符?因为这看起来很丑陋。


阅读 1789

收藏
2020-05-01

共1个答案

小编典典

如您所见,JavaScript不支持运算符重载。您可以执行的最接近的是实现toString(当实例需要被强制为字符串时valueOf将被调用)和(被强制将其强制为一个数字,例如在+用于加法时,或者在许多情况下,使用它进行串联,因为它+尝试在串联之前进行加法),这非常有限。两者都不会让您创建Vector2对象。


不过,对于遇到此问题的人想要一个字符串或数字(而不是Vector2),下面是valueOf和的示例toString。这些示例 没有
演示运算符重载,只是利用了JavaScript的内置处理将其转换为原语:

valueOf

此示例将对象val属性的值加倍以响应被强制转换为原语,例如通过+

function Thing(val) {

    this.val = val;

}

Thing.prototype.valueOf = function() {

    // Here I'm just doubling it; you'd actually do your longAdd thing

    return this.val * 2;

};



var a = new Thing(1);

var b = new Thing(2);

console.log(a + b); // 6 (1 * 2 + 2 * 2)

或搭配ES2015 class

class Thing {

    constructor(val) {

      this.val = val;

    }

    valueOf() {

      return this.val * 2;

    }

}



const a = new Thing(1);

const b = new Thing(2);

console.log(a + b); // 6 (1 * 2 + 2 * 2)

或仅包含对象,没有构造函数:

var thingPrototype = {

    valueOf: function() {

      return this.val * 2;

    }

};



var a = Object.create(thingPrototype);

a.val = 1;

var b = Object.create(thingPrototype);

b.val = 2;

console.log(a + b); // 6 (1 * 2 + 2 * 2)

toString

本示例将对象val属性的值转换为大写形式,以响应被强制转换为原语,例如通过+

function Thing(val) {

    this.val = val;

}

Thing.prototype.toString = function() {

    return this.val.toUpperCase();

};



var a = new Thing("a");

var b = new Thing("b");

console.log(a + b); // AB

或搭配ES2015 class

class Thing {

    constructor(val) {

      this.val = val;

    }

    toString() {

      return this.val.toUpperCase();

    }

}



const a = new Thing("a");

const b = new Thing("b");

console.log(a + b); // AB

或仅包含对象,没有构造函数:

var thingPrototype = {

    toString: function() {

      return this.val.toUpperCase();

    }

};



var a = Object.create(thingPrototype);

a.val = "a";

var b = Object.create(thingPrototype);

b.val = "b";

console.log(a + b); // AB
2020-05-01