2013-03-15 14 views
7

Ich versuche, das Erbe mit dem Modul Muster auf diese Weise zu implementieren:Vererbung und Modul Muster

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

    } 

}; 

aber ich nicht von Kindern Instanz der test2() zu nennen.

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

Was ich falsch?

+3

Für den Anfang wird 'this.prototype' in einem Konstruktor nicht tun, was Sie denken. Ich schlage vor, dass Sie ein Tutorial nachschlagen. –

+1

[Wie Vererbung in JS Revealing Prototyp-Muster implementieren?] (Http://stackoverflow.com/questions/9248655/how-to-implement-inheritance-in-js-revealing-prototype-pattern) erläutert ausführlich wie Verwenden Sie das Modulmuster und die Vererbung. – Bergi

Antwort

11

Sie verwenden das Modulmuster nicht auf die korrekte Weise. Irgendwie wird Ihr "Konstruktor" als direkt aufgerufener Funktionsausdruck (IIFE) aufgerufen, und die Modulschließung ist nicht. Es sollte umgekehrt sein.

Sie können auch nicht zuweisen this.prototype. Um das Prototypobjekt zu erstellen, von dem alle Instanzen erben, müssen Sie die Eigenschaft der Konstruktorfunktion zuweisen (die this keyword wies sogar auf das globale window Objekt in Ihrem Fall).

Und Sie sollten die Konstruktorfunktion, nicht das Prototyp-Objekt, aus dem IIFE zurückgeben, sobald Sie es haben.

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

Vielen Dank. Jetzt hätte ich noch eine Frage: Kann ich in Child eine statische Funktion hinzufügen? – Webman

+1

Hängt davon ab, was Sie mit "statisch" meinen, es gibt keine echte Entsprechung in der dynamischen JS-Sprache :-) Allerdings könnten Sie dem Konstruktfunktionsobjekt 'Child' eine Funktion zuweisen:' Child.method = function() { ...}; '(oder innerhalb des Modulabschlusses,' construct.method = ...; ') – Bergi

+0

mit" statisch "meine ich eine Funktion aufrufen, ohne eine Eigenschaft von' Child' zu erzeugen. Etwas wie diese 'Child.myStaticFunction()' – Webman

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

this bezieht sich auf window, weil Sie Ihren Code in eine Funktion gewickelt. Entfernen Sie die Umbruchfunktion oder übergeben Sie this als Argument.

+0

Sogar das äußere "this" als "this" passierend, wäre falsch. – Bergi

+0

Wer gibt "dieses" als "dieses"? – zeroflagL

+0

Sie sagten "* pass 'dies als Argument *", was nutzlos erscheint. OK, ich hatte angenommen, dass du es als thisArg weitergegeben hast, aber selbst wenn es nicht wichtig ist - könntest du bitte den Code posten, an den du gedacht hast? – Bergi