2010-03-03 11 views
5

Więc czytałem o blog Johna Resiga, zobaczyłem jego micro-templating javascript engine i postanowiłem spróbować zaimplementować własny system zarządzania szablonami dla javascript, aby pogłębić wiedzę na temat dziedziczenia prototypów . Jednak w momencie, w którym zacząłem go pisać, natknąłem się na problem.Jak wywołać funkcje obiektu nadrzędnego z obiektów podrzędnych w javascript

Aby rozpocząć, tutaj jest mój kod bazowy:

function template_manager() { }; 

template_manager.prototype = { 
    tags: {}, 
    templates: {}, 
    output: {}, 
    default_template: "default", 
    set: function (tags, template_name) { 
     template_name = "Greetings!"; 
     //template_name = this._util.template(this.nothing, this.default_template); 
     console.log(template_name); 
    }, 
    get: function(tags, template_name) { 
     console.log("Getting"); 
    }, 
    unset: function(tags, template_name) { 
     console.log("Removing"); 
    }, 
    render: function(template_name) { 
     console.log("Rendering"); 
    }, 
    //_util goes here 
}; 

// Take it for a quick test drive. 
test = new template_manager; 
test.set(); 
test.get(); 
test.unset(); 
test.render(); 

Potem rozpoczął pracę nad jakimś wspólnym kodzie, i zdecydowałem się umieścić go w obiekt użytkowy:

_util: { 
     // Used to set the default values for optional arguments 
     optional: function(obj, def_value) { 
      return (typeof obj === "nothing") ? obj : def_value; 
     }, 
     template: function(template_name) { 
      return this._util.optional(template_name, this.default_template); 
     }, 
    }, 

a teraz , kiedy próbuję wywołać moją funkcję _util.template() w mojej funkcji set(), oczywiście dostaję błąd, ponieważ this wskazuje obiekt _util zamiast obiektu template_manager. Spojrzałem na metodę jQuery extend i myślę, że rozumiem, co robi. Moje pytanie brzmi, czy muszę potrzebować do wdrożenia mojej własnej/użyć metody jQuery's extend, czy istnieje inny sposób, aby zadzwonić do obiektu template_manager z mojego obiektu _util?

(PS szukałem w Douglas Crockforda na article na prototypowego dziedziczenia i myślę odpowiedź brzmi nie, ale obawiam się, że nie w pełni zrozumieć go jeszcze.)

+0

@ Chris, służy mi dobrze, aby nie podwójnie sprawdzać. Dzięki za złapanie tego! –

Odpowiedz

8

Można użyć call lub apply tj

template_manager.prototype = { 
    set: function (tags, template_name) { 
     template_name = "Greetings!"; 
     template_name = this._util.optional.call(this, this.nothing, this.default_template); 
     console.log(template_name); 
    } 
} 

Zobacz "Getting Out of Binding Situations in JavaScript" artykuł do bardziej wyraźnego wyjaśnienia.

+0

Rozwiązanie działa, a artykuł wykonuje doskonałą pracę, objaśniając zakres bardziej szczegółowo. Dziękuję bardzo Li0liQ! –

+0

@Sean Vieira, nie ma za co. – Li0liQ

Powiązane problemy