2011-12-30 11 views
16

Lubię wzór moduł, który zwraca konstruktorów, jak opisano w: http://elegantcode.com/2011/02/15/basic-javascript-part-10-the-module-pattern/Łącząc dziedzictwo ze wzoru modułu

Jednak nie jestem pewien, jak dziedziczyć z obiektu, który jest realizowany z tego wzoru. Załóżmy, że mam obiekt nadrzędny realizowany w ten sposób ...

namespace('MINE'); 

MINE.parent = (function() { 
    // private funcs and vars here 

    // Public API - constructor 
    var Parent = function (coords) { 
     // ...do constructor stuff here 
    }; 

    // Public API - prototype 
    Parent.prototype = { 
     constructor: Parent, 
     func1: function() { ... }, 
     func2: function() { ... } 
    } 

    return Parent; 
}()); 

Jak mogę zdefiniować obiekt podrzędny, który również wykorzystuje wzór modułu, która dziedziczy parent w taki sposób, że mogę przeciążania, na przykład, func2?

+0

Tylko uwaga, kod podasz ma błąd - jesteś ustawienia konstruktora 'undefined'. Zmontowałem go, aby to naprawić. – Langdon

+0

Właśnie zadałem podobne pytanie tutaj: http://stackoverflow.com/questions/16659326/simple-javascript-inheritance-using-extend-and-module-pattern - zastanawiając się, co o tym sądzisz. –

Odpowiedz

16
MINE.child = (function() { 

    var Child = function (coords) { 
    Parent.call(this, arguments);  
    } 

    Child.prototype = Object.create(Parent.prototype); 

    Child.prototype.constructor = Child; 
    Child.prototype.func2 = function() { ... }; 

    return Child; 

}()); 
+1

Dziękuję. To była bardzo lakoniczna i jasna odpowiedź, która sprawdziła się dobrze. Podoba mi się ten wzorzec, ponieważ obejmuje on jednorazową inicjalizację, enkapsulację i powyższy kod, dziedziczenie. Czy widzisz jakieś poważne pułapki w tym wzorze? –

+0

@AndrewS. Osobiście nienawidzę przestrzeni nazw. Ale to jest preferencja stylu. Zamiast tego możesz użyć modułów ładujących. – Raynos

+0

To nie działa dla mnie. Gdybym miał utworzyć instancję MINE.child, nie mam dostępu do func1 (jak zdefiniowano w MINE.parent). Czy brakuje mi czegoś? I czy func2 dziecka ma zastąpić func2 rodzica? –

1

Znajduję rozwiązanie z tego bloga (http://metaduck.com/08-module-pattern-inheritance.html) czystsze. Na przykład:

function Parent(name) { 
    // Private variables here 
    var myName; 

    // Constructor 
    myName = name; 

    // Public interface 
    return { 
     func1: function() {alert("Parent func1. Name: " + myName); }, 
     func2: function() {alert("Parent func2. Name: " + myName); } 
    } 
} 

function Child(name) { 
    // Private variables here 
    var myName, 
     exportObj; 

    // Constructor 
    // Inherit 
    exportObj = Parent(name + "'s father"); 

    // Override 
    exportObj.func2 = function() { 
     alert("Child func2. Name: " + name); 
    } 

    // Export public interface 
    return exportObj; 
} 

Przykładem może być prowadzony tutaj: http://jsfiddle.net/wt4wcuLc/