Так, я читал на блоге John Resig, видел его микрошаблонную обработку механизм 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
метод, и я думаю, что понимаю то, что он делает. Мой вопрос, сделайте я должен реализовать свое собственное / используют jQuery extend
метод, или там иначе, чтобы я звонил template_manager
объект от моего _util
объект?
(P. S. Я посмотрел на статью Douglas Crockford об опытном наследовании, и я думаю, что ответ там, но я боюсь, что еще не полностью понимаю это.)
Вы можете использовать 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);
}
}
См. статью "Выход из ситуаций связывания в JavaScript" для более явного объяснения.