2013-05-31 4 views
6

Ich habe folgende MusterJS Modul Muster Überbrückungsfunktion

BASE = function() { 
    var that = {}; 
    var number = 10; 

    that.showNumber = function(){ 
     that.alertNumber(); 
    } 

    that.alertNumber = function() { 
     alert(number); 
    };  
    return that; 
}; 

CHILD = function() { 
    var that = Object.create(BASE()); 
    var secondNumber = 20; 

    // Override base function 
    that.alertNumber = function() { 
     alert(secondNumber); 
    }; 
    return that; 
}; 

var ch = CHILD(); 
ch.showNumber(); 

Können Sie mir sagen, wie kann ich mein Modul Muster einstellen von Douglas Crockford inspiriert voll alerNumber Funktion außer Kraft zu setzen? Bisher showNumber Funktion zeigt 10 statt 20

Vielen Dank im fortgeschrittenen

JSFiddle mit Code ist here

+0

Warum nicht einfach den Prototyp verwenden? Das würde es einfach machen. –

+0

Warum nicht schreiben var that = new BASE(); ? – frenchie

+0

Dieses Muster erlaubt mehrere Vererbung –

Antwort

5

Sie

ändern könnte
that.showNumber = function(){ 
    that.alertNumber(); 
} 

zu

that.showNumber = function(){ 
    this.alertNumber(); 
} 

Aber ich bin mir nicht sicher, ob ich wh sehe y Sie verwenden nicht einfach the prototype-base inheritance model.

+0

Das ist die Sache, die ich nicht vollständig verstehe. Warum wird 'this.alertNumber()' in der Basis auf 'that' in der 'Base'-Klasse referenziert? –

+0

Dieses Muster, das Sie verwenden, setzt eine 'that'-Variable in der Closure, um sicherzustellen, dass die Funktion showNumber die im Konstruktor definierte Instanz verwendet, wodurch die meisten erweiterten Vererbungsschemata nicht funktionieren (zB eine Superklassenfunktion, die eine andere Funktion aufruft und lässt) außer Kraft gesetzt). –

+0

OK, wenn ich es gut verstehe, wenn ich in der Lage sein möchte, die Elternfunktion außer Kraft zu setzen, muss ich ein anderes Muster verwenden? Es tut mir leid für so eine noobish Fragen, aber ich habe Erfahrung nur mit Java, wo Vererbung völlig anders ist. –