На самом деле парень выше прав. Один из главных аспектов говнокода - профедурный подход. С такой простынёй сложно с первого взгляда понять какие функции за что именно отвечают - разбей их на модули. Сравни. Найди одинаковые значения / вычисления одинаковых значений -> вынеси в отдельные функции -> унаследуй там где они нужны. На вид всё грамотно. Только избегай копипасты типа:
this.coords = {
top: e.clientY - this.shiftY - this.parentShift.top,
left: e.clientX - this.shiftX - this.parentShift.left
};
this.coords.top = e.clientY - this.shiftY - this.parentShift.top;
this.coords.left = e.clientX - this.shiftX - this.parentShift.left;
Которые у тебя повторяются.
coords создай вне обработчиков. Вычисления вынеси в отдельную функцию. И вызывай обработчиках когда необходимо.