2011-12-30 18 views
16

me gusta el diseño del módulo que devuelve constructores como se describe en: http://elegantcode.com/2011/02/15/basic-javascript-part-10-the-module-pattern/combinación con el patrón de herencia módulo

Sin embargo no estoy seguro de cómo heredan de un objeto que se implementa con este patrón. Supongamos que tengo un objeto padre implementado tanto ...

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

¿Cómo definir un objeto secundario que también utiliza el patrón módulo que hereda de parent de tal manera que pueda reemplazar selectivamente, por ejemplo, func2?

+0

Sólo una nota, el código que ha proporcionado tiene un error - que está configurando el constructor de 'undefined'. He editado para arreglarlo. – Langdon

+0

Acabo de hacer una pregunta similar aquí http://stackoverflow.com/questions/16659326/simple-javascript-inheritance-using-extend-and-module-pattern - preguntándome qué piensas de ella. –

Respuesta

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

Gracias. Esta fue una respuesta muy clara y concisa y funcionó bien para mí. Me gusta este patrón porque abarca una inicialización, encapsulación y con el código anterior, herencia. ¿Ves alguna trampa importante en el patrón? –

+0

@AndrewS. Personalmente odio los espacios de nombres. Pero esa es una preferencia de estilo. Puede usar cargadores de módulos en su lugar. – Raynos

+0

Esto no funciona para mí. Si tuviera que instanciar un MINE.child, no puedo acceder a func1 (como se define en MINE.parent). ¿¿Me estoy perdiendo de algo?? ¿Y se supone que la función del niño es reemplazar la función del padre? –

1

puedo encontrar la solución de este blog (http://metaduck.com/08-module-pattern-inheritance.html) más limpio. Por ejemplo:

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 ejemplo se puede ejecutar aquí: http://jsfiddle.net/wt4wcuLc/

Cuestiones relacionadas