Javascript对象属性访问父构造函数中的函数?

时间:2010-06-02 23:51:05

标签: javascript jquery

所以我使用这个非常标准的jquery插件模式,你可以在将jquery函数应用到特定实例后获取api。

这个API本质上是一个包含大量方法和数据的javascript对象。

所以我想基本上为对象创建一些私有内部方法来操作数据等,这些方法不需要作为API的一部分提供。

所以我尝试了这个:

// API returned with new $.TranslationUI(options, container)
$.TranslationUI = function (options, container) {
    // private function?
    function monkey(){
        console.log("blah blah blah");
    }
    // extend the default settings with the options object passed
    this.settings = $.extend({},$.TranslationUI.defaultSettings,options);

    // set a reference for the container dom element
    this.container = container;

    // call the init function
    this.init();
};

我遇到的问题是init无法调用该函数“monkey”。我不理解为什么它不能解释。是因为init是原型方法吗?($。TranslationUI的原型扩展了一堆方法,包括代码中的其他地方的init)

$.extend($.TranslationUI, {
     prototype: {
            init : function(){
                // doesn't work
                monkey();
                // editing flag
                this.editing = false;
                // init event delegates here for
                // languagepicker
                $(this.settings.languageSelector, this.container).bind("click", {self: this}, this.selectLanguage);
            }
        }
    });

任何解释都会有所帮助。我也喜欢用这个模型创建私有方法的其他想法。

这些特定的功能不一定是原型,我不需要保护私有方法不被外部使用,但我想知道将来我应该如何满足这一要求。

//根据马修的评论编辑 所以我尝试根据Matthew的评论移动原型定义。这似乎现在有效,但仍不确定这是否是正确的方法。思考?显然,如果我将原型对象移动到一个单独的区域中会更干净

$.TranslationUI = function (options, container) {
    function monkey(){
        console.log("blah blah blah");
    }
    // extend the default settings with the options object passed
    this.settings = $.extend({},$.TranslationUI.defaultSettings,options);

    // set a reference for the container dom element
    this.container = container;

    $.extend($.TranslationUI.prototype,
        {
            init : function(){
                monkey();
                // editing flag
                this.editing = false;
                // init event delegates here for
                // languagepicker
                $(this.settings.languageSelector, this.container).bind("click", {self: this}, this.selectLanguage);
            }
        }
    );

    // call the init function
    this.init();
};

因此,虽然这很有效,但每次构造函数运行时,我都会重新启动原型。我敢肯定这不高效。但不确定如何让原型方法可以访问某个实例的私有函数/变量。

3 个答案:

答案 0 :(得分:1)

错误是因为在你从$ .extend调用的范围内没有定义monkey。

答案 1 :(得分:1)

好的。因此,在Crockford网站上确认了stackoverflow的答案。

javascript - accessing private member variables from prototype-defined functions

基本上,您无法真正从原型方法访问私有函数。你可以通过'特权'函数来反过来调用私有变量和函数,但是你基本上创建了一堆getter和setter,它们可能只是在原型“public”方法中加倍。

所以它有很多工作,特别是如果你的东西不是真的需要私密。

答案 2 :(得分:0)

看看我的回答和其他一些人:

call function inside a nested jquery plugin