2017-02-05 11 views
1

Придумайте Дата (объекта):Есть ли встроенная поддержка для реализации объектной арифметики в Javascript?

thisDate = new Date() 
thatDate = new Date() 
thisDate - thatDate //returns some date object 

Будет ли это возможно для меня, чтобы сделать какой-нибудь предмет, скажем Clovers(), что:

theseClovers = new Clovers(); 
theseClovers.count = 10; 
thoseClovers = new Clovers(); 
thoseClovers.count = 4; 

theseClovers - thoseClovers; //returns b = new Clovers(); b.count = 6 

Это способ, которым я предусмотрим (но совершенно гипотетический):

function Clovers(){ 
    onSubtract(b){ 
     if(b instanceOf someClass){ 
      return this.count - b.count 
     } 
    } 
} 
+2

Вы можете добавить функцию '.valueOf()' к вашим объектам (или прототипу); это похоже на '.toString()' за исключением чисел. – Pointy

+1

Возможный дубликат [Перегрузка арифметических операторов в JavaScript?] (Http://stackoverflow.com/questions/1634341/overloading-arithmetic-operators-in-javascript) –

ответ

2
function Clovers(val){ 
    this.count=val || 0; 
} 
Clovers.prototype.valueOf=function(){ 
return this.count; 
}; 

Так что это будет работать достаточно simila г:

alert(new Clovers(new Clovers(10)-new Clovers(5)).count); 
//or long written: 
var a=new Clovers(10); 
var b=new Clovers(4); 
var c=new Clovers(a-b); 
alert(c.count); 

Однако, было бы лучше, чтобы иметь пользовательские функции сложения, что, подобно Array.prototype.concat:

Clovers.prototype.concat=function(clover){ 
    return new Clovers(this.count-clover.count); 
}; 

Использование так:

var a=new Clovers(10); 
var b=new Clovers(5); 
var c=a.concat(b); 
alert(c.count); 

Благодаря Pointy и Karl-Johan Sjögren для идей ...

+0

Я действительно предпочитаю первый метод перегрузки valueOf(). Это как раз то, как Date работает, поскольку 'Date() - Date()' фактически возвращает значение. Так что это прекрасно! Спасибо за рыбу! – Sancarn

+0

@ Sancarn youre welcome;). пожалуйста, отметьте это как ответ ... и, кстати, его не перегрузили, его переопределение –

+0

Я искал галочку, не видел ее xD – Sancarn