Это потому, что целое число -1 (основание 10) = 11111111111111111111111111111111 (основание 2)
Если вы используете побитовые операторы, вы увидите эту проблему, поскольку она имеет дело только с 32-разрядными целыми числами.
Другие операторы, такие как умножение, позаботятся об этом. Поскольку они не являются побитовыми операторами, их вычисление не ограничивается 32-битными целыми числами. Вы можете использовать следующее.
this.colorInt = 255 + (255 * 2**8) + (255 * 2**16) + (255*2**24)
this.colorInt.toString(16) // "ffffffff"
В противном случае я бы посоветовал в качестве более читабельного подхода
function hexer(a,b,c,d){
return ([a,b,c,d].map(x=>x.toString(16)).join(''))
}
hexer([255,255,255,255]) // "ffffffff"