2011-12-30 13 views
16

Mi piace il modello di modulo che riporta i costruttori, come descritto in: http://elegantcode.com/2011/02/15/basic-javascript-part-10-the-module-pattern/Combinando eredità con il modello di modulo di

Tuttavia io non sono sicuro di come ereditare da un oggetto che viene implementato con questo modello. Supponiamo che io sono un oggetto padre implementato così ...

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; 
}()); 

Come faccio a definire un oggetto figlio che utilizza anche il modello di modulo che eredita da parent in modo tale che io possa ignorare selettivamente, per esempio, func2?

+0

Solo una nota, il codice che hai fornito ha un bug - si sta impostando il costruttore a 'undefined'. Ho modificato per risolvere il problema. – Langdon

+0

Ho appena fatto una domanda simile qui http://stackoverflow.com/questions/16659326/simple-javascript-inheritance-using-extend-and-module-pattern - chiedendoci cosa ne pensate. –

risposta

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

Grazie. Questa è stata una risposta molto precisa e chiara e ha funzionato bene per me. Mi piace questo schema perché comprende l'inizializzazione una tantum, l'incapsulamento e il codice sopra, l'ereditarietà. Vedi qualche insidia maggiore per lo schema? –

+0

@AndrewS. Personalmente odio gli spazi dei nomi. Ma questa è una preferenza di stile. Puoi invece usare i caricatori di moduli. – Raynos

+0

Questo non funziona per me. Se dovessi creare un'istanza di MINE.child, non posso accedere a func1 (come definito in MINE.parent). Mi sto perdendo qualcosa?? E il func2 del bambino dovrebbe sostituire il func2 del genitore? –

1

Trovo la soluzione da questo blog (http://metaduck.com/08-module-pattern-inheritance.html) più pulito. Per esempio:

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; 
} 

Un esempio può essere eseguito qui: http://jsfiddle.net/wt4wcuLc/