【问题标题】:Calling a method inside another method of same class在同一类的另一个方法中调用方法
【发布时间】:2013-04-16 22:02:24
【问题描述】:

我承认我对 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(),但它不会,所以我添加了倒数第二行来初始化对象。

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

如果我的解释和/或代码是垃圾节目,我深表歉意。我正在努力学习。

【问题讨论】:

  • @adeneo,OP 已经明确表示他对 javascript 了解不多。做个好人;)

标签: javascript jquery function methods


【解决方案1】:

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

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

无论如何,您可以使用this.codeAddress( 'latlng' ); 引用您的插件,而不是调用this.latlng()

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

【讨论】:

    【解决方案2】:
    return methods.init.apply( methods, arguments );
    

    【讨论】:

      【解决方案3】:

      你需要这样说:

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

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

      【讨论】:

      • 太好了,这让我克服了这个障碍。我很确定我明白你在说什么。两个问题,记录这个值会给我带来什么好处,以及当我应用 latlng 键的值时如何传递它?
      • 'this' 的值在 JS 中可能会变得很棘手,因为它会根据上下文而变化。 console.log(this) 是一个有用的工具,可以帮助您确定不同上下文中各种事物的价值。至于传递值,添加第二个参数是为您的 args 数组。即 .apply(this, [argsArray]) 看看这个stackoverflow.com/questions/1986896/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-07
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多