2017-04-12 53 views
0

这更像是一种“有趣”的事情,因为实际使用它是不切实际的。我只是想满足我的好奇心,甚至可能。运营商的变化行为

我有一个函数...

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

...其中“加”的和值相加在一起B,为字符串;意思是,它遍历每个字符并添加它们。因此,它可以计算出比可能达到的数字更大的数字。

(对于这个问题的目的,实际的代码应该是不相关的,因此不包括它)

我的问题是:这将有可能直接改变“+”操作符来使用此功能?例如,

c+d 

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

任何可能的哈克方式来实现这一目标?对此,任何经营者的行为是否可以直接改变?

注意:是的,我知道这会搞砸连接和大,数值将不得不保持字符串。这只是我很好奇的一个概念。

+0

@Quentin:嗯...这是尴尬... :-)我的意思是,我写* *公认的答案,你会认为我会有一个方便的链接,并记住要使用它。 –

+2

@ T.J.Crowder - 是的,你不记得所有你写的一万三千条答案的细节! – Quentin

回答

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)

+0

唉,好可惜...好吧,关于valueOf,有趣的是,无论如何,感谢信息。 – dav