我已经使用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类中重载运算符?因为这看起来很丑陋。
如您所见,JavaScript不支持运算符重载。您可以执行的最接近的是实现toString(当实例需要被强制为字符串时valueOf将被调用)和(被强制将其强制为一个数字,例如在+用于加法时,或者在许多情况下,使用它进行串联,因为它+尝试在串联之前进行加法),这非常有限。两者都不会让您创建Vector2对象。
toString
valueOf
+
Vector2
不过,对于遇到此问题的人想要一个字符串或数字(而不是Vector2),下面是valueOf和的示例toString。这些示例 没有 演示运算符重载,只是利用了JavaScript的内置处理将其转换为原语:
此示例将对象val属性的值加倍以响应被强制转换为原语,例如通过+:
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
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)
本示例将对象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
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