Proste dziedziczenie javascript przy użyciu $ .extend i wzorca modułu

Zastanawiałem się przez kilka lat, co ludzie myślą o zrobieniu dziedziczenia za pomocą wzorca konstruktora o strukturze wzorcowej i BEZ normalnego dziedziczenia prototypowego. Dlaczego programiści nie używają wzorca modułu dla klas js innych niż singleton? Dla mnie zaletami są:

Bardzo przejrzysty publiczny i prywatny zakres (łatwy do zrozumienia kod i api)Nie ma potrzeby śledzenia wskaźnika „this” przez $ .proxy (fn, this) w wywołaniach zwrotnychNigdy więcej var that = this, itp. Z procedurami obsługi zdarzeń itp. Ilekroć widzę 'this', wiem, że to kontekst jest przekazywany do wywołania zwrotnego, to NIE jest coś, co śledzę, aby poznać moją instancję obiektu.

Niedogodności:

Mała degradacja perfRyzyko „machnięcia palcem” od Douga Crockforda?

Rozważ to (wystarczy uruchomić w dowolnej konsoli js)

var Animal = function () {
    var publicApi = {
        Name: 'Generic',
        IsAnimal: true,
        AnimalHello: animalHello,
        GetHelloCount:getHelloCount
    };

    var helloCount = 0;

    function animalHello() {
        helloCount++;
        console.log(publicApi.Name + ' says hello (animalHello)');
    }

    function getHelloCount(callback) {
        callback.call(helloCount);
    }

    return publicApi;
};

var Sheep = function (name) {
    var publicApi = {
        Name: name || 'Woolie',
        IsSheep: true,
        SheepHello: sheepHello
    };

    function sheepHello() {
        publicApi.AnimalHello();
        publicApi.GetHelloCount(function() {
            console.log('i (' + publicApi.Name + ') have said hello ' + this + ' times (sheepHello anon callback)');
        });
    }

    publicApi = $.extend(new Animal(), publicApi);
    return publicApi;
};

var sheepie = new Sheep('Sheepie');
var lambie = new Sheep('Lambie');

sheepie.AnimalHello();
sheepie.SheepHello();
lambie.SheepHello();

Moje pytanie brzmi: jakie są wady tego podejścia, którego nie widzę? Czy to dobre podejście?

Dzięki!

[aktualizacja]

Dziękuję za wspaniałe odpowiedzi. Chciałbym dać wszystkim nagrodę. Tego właśnie szukałem. Zasadniczo to, co myślałem. Nigdy nie użyłbym wzorca modułu do skonstruowania więcej niż kilku wystąpień czegoś. Zwykle tylko para. Powodem, dla którego myślę, że ma swoje zalety, jest to, że niewielka degradacja perf, którą widzisz, jest odzyskiwana w prostocie doświadczenia kodowania. Mamy teraz sporo kodu do napisania. Musimy również ponownie użyć kodu innych ludzi i osobiście doceniam to, gdy ktoś poświęcił czas na stworzenie ładnego, eleganckiego wzoru, zamiast dogmatycznie trzymać się prototypowego dziedziczenia, gdy ma to sens.

questionAnswers(3)

yourAnswerToTheQuestion