jQuery - 插件方法调用

Pie*_*NAY 3 javascript jquery jquery-plugins

我正在尝试按照一些官方最佳实践创建一个jQuery插件

(function($){

  var methods = {
    init : function( options ) {
      this.options = options;
    }
  , add_that: function (elem) {
      this.append(elem);
      return (this);
    }
  , add_this: function (elem) {
      return (methods.add_that(elem));
    }
  };

  $.fn.test = function (method) { 
    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.test' );
    }    
  };

})(jQuery);
Run Code Online (Sandbox Code Playgroud)

我希望该方法add_that能够将事物附加到匹配的元素.
现在调用此方法add_this.

$('#test').test('add_this', $('<div />'));
Run Code Online (Sandbox Code Playgroud)

TypeError:this.append不是函数

为什么我无法访问插件(this)add_that

Jam*_*iec 6

因为当你调用它时范围已经改变了add_this.请注意,用于Function.apply调用范围的原始调用this.

if ( methods[method] ) {
  return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
}
Run Code Online (Sandbox Code Playgroud)

所以你可以通过在你的方法中再次使用apply来解决这个问题:

add_this: function (elem) {
  return methods.add_that.apply(this,[elem]);
}
Run Code Online (Sandbox Code Playgroud)

实例:http://jsfiddle.net/XaUHV/