【问题标题】:Change Behavior of Operators [duplicate]更改操作员的行为 [重复]
【发布时间】:2017-09-08 06:15:26
【问题描述】:

这更像是一种“为了好玩”的东西,因为实际使用它是不切实际的。我只是想满足我对这是否可能的好奇心。

我有一个函数...

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

...将 a 和 b 的值作为字符串“添加”在一起;意思是,它遍历每个字符并将它们相加。因此,它可以计算出比其他方式更大的数字。

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

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

c+d

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

任何可能的hacky方法来实现这一点?那么,是否可以直接改变任何运营商的行为?

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

【问题讨论】:

  • @Quentin:嗯...这很尴尬... :-) 我的意思是,我在那里接受的答案,你会认为我有一个链接方便,记得使用它。
  • @T.J.Crowder — 是的,你不记得你写的所有一万三千个答案的细节是可耻的!

标签: javascript


【解决方案1】:

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

不,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)

【讨论】:

  • 啊,真可惜……好吧,无论如何,valueOf 很有趣,感谢您提供的信息。
猜你喜欢
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 2011-11-12
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
相关资源
最近更新 更多