Mam taki kod:
// modify node methods // is a function and is not a protected function this.node.prototype[name] = function() { var event_before = new $.Event("before.node.btree"); var result; // trigers a "before.node.btree" event result = $.btree.data.container.triggerHandler(event_before, { "method_name" : name, "instance" : this, "args" : args }); // if propagation stopped if (result === false) return; // if triggered event returns a value if (typeof result !== "undefined") { // then we are changing args passed to a proper node method args = result; } // extend and call node method result = value.apply( $.extend(this, { _callback : function (data) { $.btree.data.container.triggerHandler( name + '.node.btree', {"instance" : this, "args" : args, "data" : data}); } }), args); return result; } } else { // is a protected method or var this.node.prototype[name] = value; } }, this));
Zaraz na początku "this.data.node_data" to zwykły obiekt {} dwuwymiarowy, gdzie "kluczami" są nazwy zmiennych lub funkcji, a wartościami null w przypadku zmiennych lub funkcjami w przypadku metod. "this.node" to przyszła instancja klasy reprezentująca liść w drzewie i do prototypu tej klasy przypisujemy rzeczy z this.data.node_data.
Teraz miejsce gdzie jest "result = value.apply... i tam extend. Jest tworzona dynamicznie metoda "_callback" a dynamicznie dlatego, żeby nie wpisywać w normalnych metodach klasy "this.node" jakiego triggera ma uruchomić - "before.node.btree" lub np. "load.node.btree" czy nie przekazywać znowu ręcznie parametrów do triggera itp.
To wszystko działa jak należy ALE. Jak wywołam metodę ta rozszerzona, która zawiera _callback() i w niej gdzieś pod drodze wewnątrz klasy "this.node" znowu wywołam taka rozszerzona metodę to nie wszystkie dodane funkcje "_callback" (i co za tym idzie triggery) się uruchamiają. A uruchamiają się tylko te ostatnie.
Ten opisany problem znika, kiedy w value.apply zrobię kopie "this" czyli instancji klasy "this.node" tylko ze wtedy właśnie na kopii są wykonywane wewnętrzne jakieś operacje i nic nie działa tak jak należy.
Odkryłem, ze jeśli działa na kopii to wtedy ta dodana funkcja "_callback" nie jest tak jakby nadpisywana - dokładnego mechanizmu nie potrafię ogarnać.
Jest na to jakiś sposób aby zachować taką funkcjonalność (rozszerzanie funkcji) i jednocześnie sprawić żeby działało także w w/w przypadku?