在同一个类的另一个方法中调用一个方法

时间:2013-04-16 22:02:25

标签: javascript jquery function methods

我承认自己知道一点点javascript,jquery或oop,但我知道足够多的东西可以把它们拼凑起来,有时让它们起作用。然而,这是我的头脑,尽管我谷歌,我无法做出正在发生的事情的正面或反面。这是我的代码的要点:

jQuery(document).ready(function($) {

    var methods = {
        init : function( options ) { 
            if (somthing) {
                this.latlng(input);//  <--- ERROR: Object has no method
            }
        },
        auto : function( ) {
            if (something) {
                this.latlng(input);
            } else {
                this.location(input);
            }
        },
        location : function ( input ) {
            // draw map
        },
        latlng : function ( input, l ) {
            // draw map
        }
    }

    $.fn.codeAddress = function( method ) {
        // Method calling logic
        if ( methods[method] ) {
            return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
        } else if ( typeof method === 'object' || ! method ) {
            return methods.init.apply( this, arguments );
        } else {
            $.error( 'Method ' +  method + ' does not exist on jQuery.tooltip' );
        }  
    };

    var geo = new $(document).codeAddress(); // Initialize the object   
});

我依靠jQuery Docs Plugin/Authoring作为我的模板,并从那里开始零碎。理想情况下,当文档准备就绪时,它会自己加载init(),但不会这样,我会添加倒数第二行来初始化对象。

最初使用方法latlng()在init()中创建一个映射来绘制它。这就是我在第6行得到错误的地方,this.latlng(输入)Uncaught TypeError:Object [object Object]没有方法'latlng'。此后,onclick事件处理程序调用auto()根据它接收的输入重绘地图。

如果我的解释和/或代码是junkshow,我道歉。我正在努力学习。

3 个答案:

答案 0 :(得分:0)

你需要这样说:

methods['latlng'].apply(this);

原因是因为this的值不是您的插件。您应该将this的值实际记录到控制台以获得更多洞察力,但实际上,您已在插件中声明了一个名为methods的对象。 latlng位于该对象的上下文中。为了调用它,你可以通过它的键(latlng)引用它并调用.apply()方法。

答案 1 :(得分:0)

return methods.init.apply( methods, arguments );

答案 2 :(得分:0)

在jQuery插件的代码中,this是对包含当时迭代的DOM元素的jQuery对象的引用。

在您的情况下,您已将插件手动附加到document (您应该在您的网站代码中执行此操作,而不是在插件文件中)

在任何情况下,您都可以使用this.latlng()引用您的插件,而不是致电this.codeAddress( 'latlng' );

这是jQuery插件的预期功能,如果你以这种方式访问​​它,它会保持干净。