运营商的变化行为

时间:2017-04-12 12:47:31

标签: javascript

这更像是一个有趣的"有点像,因为实际使用它是不切实际的。我只想满足自己的好奇心,看它是否可能。

我有一个功能...

function longAdd(a,b){
  //computation here
  return sum;
}

..."添加" a和b的值一起作为字符串;意思是,它遍历每个角色并将它们相加。因此,它可以计算大于原本可以实现的数字。

(就本问题而言,实际代码不应该相关,因此不包括在内)

我的问题是:是否可以直接更改" +"运营商使用这个功能?例如,

c+d

代码中的任何地方都会计算longAdd(c,d)。

任何可能的hacky方法来实现这一目标?就此而言,任何运营商的行为都可以直接改变吗?

注意:是的,我知道这会搞砸串联,大数值必须保持字符串。这只是一个我很好奇的概念。

1 个答案:

答案 0 :(得分:2)

  

我的问题是:是否可以直接更改“+”运算符以使用此功能?

不,JavaScript根本没有用户定义的运算符重载。

我可以看到最接近的是使用自己的valueOf方法定义一个对象,该方法返回将自身转换为字符串并仅对其自身执行longAdd并返回该结果的结果。然后,现有的+将在ab引用的对象上触发该行为。

这并没有超载+,只是利用它已有的行为:

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)