2016-05-05 18 views
2

Ich habe ein JavaScript-Objekt wie unten:eine innere Funktion einer Prototypfunktion in JavaScript Überschreiben

var Loader = function() {} 
Loader.prototype = { 
    constructor: Loader, 
    foo: function(a, b) { 
     function bar() { 
      return a + b; 
     } 
     return bar(); 
    } 
}; 

I der Stange() Funktion im Inneren foo außer Kraft setzen müssen. Die foo Funktion kann außer Kraft gesetzt werden, wie:

Loader.prototype.foo = function() {} 

ich das gleiche für die innere Funktion versucht haben, aber kein Glück.

Loader.prototype.foo.bar = function() {}//doesnt work 
Loader.prototype.foo.protoype.bar = function() {}//doesnt work 

würde ich mich sehr freuen, wenn mir jemand in die richtige Richtung zeigen könnte. Vielen Dank im Voraus

+1

wird dir nicht helfen, die innere Funktion außer Kraft setzen kann, weil es Anwendungsbereich ist auf das beschränkt ist die Funktion foo. –

+0

Ich denke, Sie müssen die gesamte Funktion foo() überschreiben (kopieren Sie) und nur die relevanten Teile ändern. Ja, es kann schlecht sein, wenn Updates für das ankommen, was Sie überschreiben (eine Libelle eines Drittanbieters, vielleicht). – Thernys

Antwort

3

In der aktuellen Deklaration kann die bar() Funktion nicht geändert werden. Es existiert im Rahmen der foo() Methode und kann nicht von außen verändert werden.


Eine alternative Lösung für eine dynamische Überschreibung könnte sein:

var Loader = function() {} 
Loader.prototype = { 
    constructor: Loader, 
    foo: function(a, b, barFun) { 
     if (typeof barFun !== 'function') { 
      barFun = function() { 
       return a + b; 
      } 
     } 
     return barFun.call(this, a, b); 
    } 
}; 

Wenn foo() Aufruf, es ist möglich, eine benutzerdefinierte Funktion als dritter Parameter zu verwenden.
Dann können Sie es verwenden:

var loader1 = new Loader(); 

loader1.foo(1, 2); // prints 1 + 2 = 3, default bar() function 

loader1.foo(1, 2, function(a, b) { 
    return a - b; 
}); // prints 1 - 2 = -1, custom bar() function 

Überprüfen Sie die working demo.

+0

Danke für die schnelle Antwort, sieht aus wie ich muss mit diesem Ansatz gehen. – Sandeep

+0

Aber 'bar' kann effektiv ersetzt werden, indem man einfach' foo' eine andere Funktion zuweist, die einen anderen Code verwendet als was 'bar' macht und dies kann von außen erfolgen. – jfriend00

+1

@ jfriend00 was bedeutet, wenn ich 60 verschiedene Funktionen innerhalb von foo() habe, muss ich sie alle überschreiben. – Sandeep

0

Meiner Meinung nach ist die innere Bar Funktion ist nicht die Methode der äußer foo Funktion, die die Methode der Lader object.Hope ist, dass es Sie

+0

Nein, das hilft nicht. bar() ist eine Funktion von foo(), die eine Funktion von Loader ist. – Sandeep

+0

Ich meinte nur, dass es nicht die Methode ist. – laoqiren