2010-03-03 4 views
5

Итак, я читал blog от John Resig, видел его micro-templating javascript engine и решил попробовать реализовать собственную систему управления шаблонами для javascript, чтобы углубить мое понимание наследования прототипов , Однако, как только я начал писать, у меня возникла проблема.Как вы вызываете родительские функции объекта из дочерних объектов в javascript

Для начала, вот мой базовый код:

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(); 

Тогда я начал работать на какой-то общий код, и я решил поставить его в полезности объекта:

_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); 
     }, 
    }, 

И теперь , когда я пытаюсь вызвать функцию _util.template() в моей функции set(), я, конечно, получаю сообщение об ошибке, потому что this указывает на объект _util, а не объект template_manager. Я взглянул на метод jQuery extend, и я думаю, что я понимаю, что он делает. Мой вопрос: do нужен для реализации моего собственного/использования метода jQuery's extend, или есть ли другой способ для меня вызвать объект template_manager из моего объекта _util?

(PS Я посмотрел на Дугласа Крокфорд-х article на наследование прототипа, и я думаю, что ответ, но я боюсь, что я не совсем понимаю, это все же.)

+0

@ Крис, служит мне для того, чтобы не проверять дважды. Спасибо, что поймали это! –

ответ

8

Вы можете использовать call или apply т.е.

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); 
    } 
} 

"Getting Out of Binding Situations in JavaScript" См статью для более явного объяснения.

+0

Решение работает, и в статье делается отличная работа, объясняющая область действия более подробно. Большое спасибо Li0liQ! –

+0

@Sean Vieira, добро пожаловать. – Li0liQ