这更像是一个有趣的"有点像,因为实际使用它是不切实际的。我只想满足自己的好奇心,看它是否可能。
我有一个功能...
function longAdd(a,b){
//computation here
return sum;
}
..."添加" a和b的值一起作为字符串;意思是,它遍历每个角色并将它们相加。因此,它可以计算大于原本可以实现的数字。
(就本问题而言,实际代码不应该相关,因此不包括在内)
我的问题是:是否可以直接更改" +"运营商使用这个功能?例如,
c+d
代码中的任何地方都会计算longAdd(c,d)。
任何可能的hacky方法来实现这一目标?就此而言,任何运营商的行为都可以直接改变吗?
注意:是的,我知道这会搞砸串联,大数值必须保持字符串。这只是一个我很好奇的概念。
答案 0 :(得分:2)
我的问题是:是否可以直接更改“+”运算符以使用此功能?
不,JavaScript根本没有用户定义的运算符重载。
我可以看到最接近的是使用自己的valueOf
方法定义一个对象,该方法返回将自身转换为字符串并仅对其自身执行longAdd
并返回该结果的结果。然后,现有的+
将在a
和b
引用的对象上触发该行为。
这并没有超载+
,只是利用它已有的行为:
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)