2017-04-19 3 views
1

Wie überschreiben Sie eine Funktion für ein JavaScript-Objekt, wenn die Funktion für ein anderes Objekt innerhalb des übergeordneten Objekts ist.Überschreiben einer Funktion für die Eigenschaft eines JavaScript-Objekts

Beispiel:

function TestingABC() { 
    this.events = { finish: function() { console.log("FINISHED"); } }; 
} 

function TestingXYZ() { 
    TestingABC.call(this); 
} 

TestingXYZ.prototype = Object.create(TestingABC.prototype); 

Wie würde ich die events.finish Funktion auf TestingXYZ überschreiben die Eltern (TestingABC) Code zusammen mit einigen neuen Code, den ich schreiben müssen, laufen?

+1

'var alt = this.events.finish?; this.events.finish = function() {console.log ('neue Funktion'); old.call (dies); }; '? – zerkms

+0

@RobG Warum haben Sie Ihre Antwort gelöscht? – zerkms

Antwort

0

Da die events Objekt-Eigenschaft der Instanz ist, nicht auf dem Prototyp, können Sie eine Technik ähnlich Affen beschäftigen könnten Patchen, wo Sie die aktuelle Funktion eine Referenz zu speichern, dann die aktuelle Funktion mit einer überschreiben, kann rufe den alten an und mach andere Sachen.

z.B.

function TestingABC() { 
    this.events = { finish: function() { console.log("FINISHED"); } }; 
} 

function TestingXYZ() { 
    TestingABC.call(this); 
    var superEvents = this.events; 
    this.events = { 
     finish: function() { 
       superEvents.finish(); 
       doMyStuff(); 
     } 
    }; 
} 

TestingXYZ.prototype = Object.create(TestingABC.prototype); 
+0

Was ist mit 'TestingXYZ.prototype.constructor = TestingXYZ'? : D – Badacadabra

+0

@Badacadabra Ich bin mir nicht sicher, was du meinst, sorry. – GregL

+1

Kein Problem ...;) Tatsächlich ist es in der Regel eine gute Idee, den Konstruktor bei Verwendung der Vererbung in ES5 neu zuzuordnen. 'Object.create()' verwendet den gesamten Prototyp der übergeordneten "Klasse", die den übergeordneten Konstruktor enthält. Aber der wahre Konstruktor der "Unterklasse" ist nicht der Elternkonstruktor ... Hier ist der obige Code nützlich. :) – Badacadabra

0

.events ist eine instanzierte Eigenschaft des TestingABC() Konstruktor - so können Sie den Wert ändern, sobald Sie eine Instanziierung davon haben.

Vielleicht so etwas ist, was Sie nach ...

function TestingABC() { 
    this.events = { 
     finish: function() { 
      console.log('ABC FINISHED'); 
     }, 
     other: function() { 
      console.log('ABC OTHER'); 
     } 
    }; 
} 

function TestingXYZ() { 
    TestingABC.call(this); 
} 

TestingXYZ.prototype = Object.create(TestingABC.prototype); 

TestingXYZ.prototype.callEvents = function() { 
    this.events.finish(); 
    this.events.other(); 
} 

var test1 = new TestingABC(); 
var test2 = new TestingXYZ(); 

test2.events.finish = function() { 
    console.log('XYZ FINISHED'); 
}; 

test1.events.finish(); 
test1.events.other(); 
//-> ABC FINISHED 
//-> ABC OTHER 

test2.callEvents(); 
//-> XYZ FINISHED 
//-> ABC OTHER 
Verwandte Themen