2016-11-22 2 views
0

Angenommen, ich habe eine Klasse, die später einige Callbacks hinzufügen soll.Ist es effizienter, eine gemeinsame leere Funktion zu verwenden, anstatt eine neue in jeder Klasseninstanz zu erstellen?

function myclass() { 
    this.onSomething = function() {}; 
    this.onOtherThing = function() {}; 

    this.something = function() { 
     // stuff 
     this.onSomething(); 
    }; 

    this.otherThing = function() { 
     // other stuff 
     this.onOtherThing(); 
    }; 
} 

kann ich nicht this.onSomething und this.onOtherThingundefined oder null zu sein, weil, wenn sie in something() und otherThing() genannt werden, wird ein Fehler ausgelöst werden, die besagt, dass ihre Art nicht eine Funktion ist.

Da diese leeren Funktionen benötigt werden, aber sie Speicher verwenden, wird die Klasse effizienter, wenn ich das mache?

function myclass() { 
    this.onSomething = empty; 
    this.onOtherThing = empty; 
    ... 
} 

function empty() { 

} 

Auf diese Weise zeigen die Eigenschaften jeder Klasseninstanz auf dieselbe leere Funktion, anstatt jedes Mal neue Funktionen zu erstellen. Ich nehme an, dass das Definieren einer leeren Methode nicht viel Speicher erfordert, aber trotzdem ... ist das technisch besser?

Antwort

1

Sie über die Tatsache stimmen, dass eine neue Funktion für jede Instanz der Klasse erstellt wird. Um dies in allen Instanzen gemeinsam genutzt haben, können Sie es auf dem Prototyp der Klasse deklarieren:

var MyClass = function() { 
    this.something = function() { 
     // stuff 
     this.onSomething(); 
    }; 

    this.otherThing = function() { 
     // other stuff 
     this.onOtherThing(); 
    }; 
} 

MyClass.prototype.onSomething = function() {}; 
MyClass.prototype.onOtherThing = function() {}; 

Auf diese Weise werden die Methoden von allen Instanzen gemeinsam genutzt werden.

0

Warum versuchen Sie nicht return true oder return false anstatt leere Funktionen zurückgeben. oder am besten können Sie:

function myclass() { 
    this.onSomething = false; 
    this.onOtherThing = false; 
    ... 
} 

nach Ihrem Kommentar können Sie versuchen:

function myclass() { 
    this.onSomething = empty(); 
    this.onOtherThing = empty(); 
     ... } 

function empty() { 
    //return something 
    return true; 
} 
+0

Weil, wenn 'something()' 'this.onSomething' aufruft, wird es einen Fehler werfen:' Uncaught TypeError: false ist keine Funktion' –

+0

okay. Du kannst versuchen 'function myclass() { this.onSomething = empty(); this.onOtherThing = leer(); ... } Funktion leer() { // zurück etwas zurück wahr; } ' – candidJ

+0

Wieder. 'empty()' gibt 'true' zurück, also' this.onSomething = empty(); 'bedeutet' this.onSomething' ist 'true'. Wenn 'something()' 'this.onSomething' aufruft, bekomme ich' Uncaught TypeError: this.onSomething ist keine Funktion' da ... es ist ein boolscher Wert und keine tatsächliche Funktion. –

Verwandte Themen