Как вы вызываете функции родительского объекта из дочерних объектов в JavaScript - PullRequest
5 голосов
/ 04 марта 2010

Итак, я читал в блоге Джона Ресига , увидел его микро-шаблонизатор 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 и думаю, что понимаю, что он делает.У меня вопрос: нужно ли для реализации моего собственного / использования метода extend в jQuery, или есть другой способ вызова объекта template_manager из моего объекта _util?

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

1 Ответ

8 голосов
/ 04 марта 2010

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

...