Escolhendo um padrão OOP em javascript

Reuni essas informações com a ajuda de outras pessoas e de vários recursos. Eu fiz um violino de tudo, e o código simplificado é publicado abaix

Basicamente, eu aprendi a usar cada um desses padrões, mas estou curioso sobre as diferenças mais fundamentais entre essas abordagens. O código a jusante é praticamente idêntico a qualquer um desses padrões, mas há uma razão pela qual alguém deve usar um sobre o outro, além da preferência pessoal? Além disso, embora eu tenha tentado reunir os padrões mais comuns, sugira o seu, se for melho

Padrão 1 (baseado em objeto):

var mouseDiff = {
    "startPoint" : {"x" :0, "y" : 0},
    "hypotenuse" : function(a,b) {
        // do something
    },
    "init"       : function(){
        // do something
    }
}

mouseDiff.init();

Padrão 2 (o mais tradicional até onde eu sei):

function MouseDiff() {
    this.startPoint = {"x" :0, "y" : 0};
}

MouseDiff.prototype.hypotenuse = function(a,b) {
    // do something
}

MouseDiff.prototype.init = function() {
    // do something
}

var myMouse = new MouseDiff;
myMouse.init();

Padrão 3 (Fazendo uso do fechamento):

var MouseDiff2 = (function() {
    var startPoint = {"x" :0, "y" : 0};
    var hypotenuse = function(a,b) {
        // do something
    };
    return {
        hypotenuse: hypotenuse,
        init : function(){
            // do something
        }
    };

}());
MouseDiff2.init();

questionAnswers(6)

yourAnswerToTheQuestion