Как Вы вызываете функции родительского объекта от дочерних объектов в JavaScript

Так, я читал на блоге 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 об опытном наследовании, и я думаю, что ответ там, но я боюсь, что еще не полностью понимаю это.)

5
задан Sean Vieira 3 March 2010 в 22:03
поделиться

1 ответ

Вы можете использовать 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" для более явного объяснения.

8
ответ дан 14 December 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: