2013-03-15 15 views
7

Sto cercando di implementare l'eredità con il modello del modulo in questo modo:Ereditarietà e modulo modello

Parent = function() { 

    //constructor 
    (function construct() { 
     console.log("Parent"); 
    })(); 

    // public functions 
    return this.prototype = { 

     test: function() { 
      console.log("test parent"); 
     }, 


     test2: function() { 
      console.log("test2 parent"); 
     } 

    }; 
}; 


Child = function() { 

    // constructor 
    (function() { 
     console.log("Child"); 
     Parent.call(this, arguments); 
     this.prototype = Object.create(Parent.prototype); 
    })(); 


    // public functions 
    return this.prototype = { 

     test: function() 
     { 
      console.log("test Child"); 
     } 

    } 

}; 

ma non riesco a chiamare da esempio per figli test2().

var c = new Child(); 
c.test2(); // c.test2 is not a function 

Cosa ho sbagliato?

+3

Per i principianti, 'this.prototype' all'interno di un costruttore non farà ciò che si pensa. Ti suggerisco di cercare un tutorial. –

+1

[Come implementare l'ereditarietà nel modello di prototipo JS Revealing?] (Http://stackoverflow.com/questions/9248655/how-to-implement-inheritance-in-js-revealing-prototype-pattern) spiega in dettaglio come usa il modello del modulo e l'ereditarietà. – Bergi

risposta

11

Non si sta utilizzando il modello di modulo nel modo corretto. In qualche modo, il "costruttore" viene chiamato come un'espressione di funzione immediatamente invocata (IIFE) e la chiusura del modulo non lo è. Dovrebbe essere il contrario.

Inoltre, non è possibile assegnare a this.prototype. Per creare l'oggetto prototipo da cui erediteranno tutte le istanze, sarà necessario assegnare alla proprietà prototype della funzione di costruzione (lo this keyword uguale anche all'oggetto globale window nel tuo caso).

E si dovrebbe restituire la funzione di costruzione, non l'oggetto prototipo, dall'IFE non appena lo si possiede.

Parent = (function() { 
    // constructor 
    function construct() { 
     console.log("Parent"); 
    }; 

    // public functions 
    construct.prototype.test = function() { 
     console.log("test parent"); 
    }; 
    construct.prototype.test2 = function() { 
     console.log("test2 parent"); 
    }; 

    return construct; 
})(); 


Child = (function() { 
    // constructor 
    function construct() { 
     console.log("Child"); 
     Parent.apply(this, arguments); 
    } 

    // make the prototype object inherit from the Parent's one 
    construct.prototype = Object.create(Parent.prototype); 
    // public functions 
    construct.prototype.test = function() { 
     console.log("test Child"); 
    }; 

    return construct; 
})(); 
+0

Grazie mille. Ora avrei un'altra domanda: è possibile aggiungere in Child una funzione statica? – Webman

+1

Dipende da cosa intendi per "statico", non esiste un reale equivalente a quello nel linguaggio JS dinamico :-) Tuttavia, potresti assegnare una funzione all'oggetto funzione di costruzione 'Child':' Child.method = function() { ...}; '(o all'interno del modulo di chiusura,' construct.method = ...; ') – Bergi

+0

con" statico ", intendo chiamare una funzione senza creare un'istanza di' Child'. Qualcosa come questo 'Child.myStaticFunction()' – Webman

0
(function() { 
    console.log("Child"); 
    Parent.call(this, arguments); 
    this.prototype = Object.create(Parent.prototype); 
})(); 

this si riferisce a window, perché è avvolto il codice in una funzione. Rimuovere la funzione di wrapping o passare this come argomento.

+0

Anche passare l'esterno 'this' come' this' sarebbe sbagliato. – Bergi

+0

Chi passa 'questo' come' questo'? – zeroflagL

+0

Hai detto "* passa' this' come argomento * ", che sembra inutile. OK, avevo dato per scontato che tu l'avessi passato come thisArg, ma anche se non fosse importante, potresti inserire il codice che hai pensato? – Bergi