代码之家  ›  专栏  ›  技术社区  ›  Sean Vieira

如何在javascript中从子对象调用父对象函数

  •  5
  • Sean Vieira  · 技术社区  · 14 年前

    所以,我在读约翰·瑞斯格的 blog 看到他的 micro-templating javascript engine 并决定尝试实现自己的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() 在My中的功能 set() 函数i当然会出错,因为 this 指向 _util 对象而不是 template_manager 对象。我看了一下jquery extend 方法,我想我明白它在做什么。我的问题是,我 需要 实现我自己的/使用jquery的 延伸 方法,或者有其他方法让我调用 模板管理器 来自我的对象 乌蒂尔 对象?

    (P.S.我看过道格拉斯·克罗克福德的 article 关于原型继承,我 认为 答案就在那里,但恐怕我还没有完全理解。)

    1 回复  |  直到 14 年前
        1
  •  8
  •   Li0liQ    14 年前

    你可以使用 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" 文章的解释更为明确。