【问题标题】:How to access method in prototypal inheritance pattern?如何访问原型继承模式中的方法?
【发布时间】:2016-10-24 05:53:21
【问题描述】:

我刚刚找到了这个资源jQuery Prototypal Inheritance Boiler Plate,我想将它用作我为我的应用程序构建的自定义插件的基础,但我很难理解如何访问这个对象本身的方法。 (请参考下面我留下评论的代码 sn-p /* 这似乎不起作用 */)

我希望能够在同一个对象中调用一个方法,但没有成功。我相信我对它的工作原理有一些误解,所以希望得到你的建议。谢谢!

/*!
 * jQuery prototypal inheritance plugin boilerplate
 * Author: Alex Sexton, Scott Gonzalez
 * Further changes: @addyosmani
 * Licensed under the MIT license
 */

// myObject - an object representing a concept that you want
// to model (e.g. a car)
var myObject = {
  init: function( options, elem ) {
    // Mix in the passed-in options with the default options
    this.options = $.extend( {}, this.options, options );

    // Save the element reference, both as a jQuery
    // reference and a normal reference
    this.elem  = elem;
    this.$elem = $(elem);

    // Build the DOM's initial structure
    this._build();

    // return this so that we can chain and use the bridge with less code.
    return this;
  },
  options: {
    name: "No name"
  },
  _build: function(){
    //this.$elem.html('<h1>'+this.options.name+'</h1>');
  },
  myMethod: function( msg ){
    // You have direct access to the associated and cached
    // jQuery element
    console.log("myMethod triggered");
    // this.$elem.append('<p>'+msg+'</p>');
  }
  myQuestion: function ( msg ) {
    /* ========================= */
    /* This doesn't seem to work */
    /* ========================= */
    this.myMethod( msg );
  }
};

// Object.create support test, and fallback for browsers without it
if ( typeof Object.create !== "function" ) {
    Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
}

// Create a plugin based on a defined object
$.plugin = function( name, object ) {
  $.fn[name] = function( options ) {
    return this.each(function() {
      if ( ! $.data( this, name ) ) {
        $.data( this, name, Object.create(object).init(
        options, this ) );
      }
    });
  };
};

// Usage:
// With myObject, we could now essentially do this:
// $.plugin('myobj', myObject);

// and at this point we could do the following
// $('#elem').myobj({name: "John"});
// var inst = $('#elem').data('myobj');
// inst.myMethod('I am a method');

【问题讨论】:

    标签: javascript jquery inheritance


    【解决方案1】:

    你的 myMethod: function(msg); 之后缺少一个 ,

    这样做;

    /*!
     * jQuery prototypal inheritance plugin boilerplate
     * Author: Alex Sexton, Scott Gonzalez
     * Further changes: @addyosmani
     * Licensed under the MIT license
     */
    
    // myObject - an object representing a concept that you want
    // to model (e.g. a car)
    var myObject = {
      init: function( options, elem ) {
        // Mix in the passed-in options with the default options
        this.options = $.extend( {}, this.options, options );
    
        // Save the element reference, both as a jQuery
        // reference and a normal reference
        this.elem  = elem;
        this.$elem = $(elem);
    
        // Build the DOM's initial structure
        this._build();
    
        // return this so that we can chain and use the bridge with less code.
        return this;
      },
      options: {
        name: "No name"
      },
      _build: function(){
        //this.$elem.html('<h1>'+this.options.name+'</h1>');
      },
      myMethod: function( msg ){
        // You have direct access to the associated and cached
        // jQuery element
        console.log("myMethod triggered");
        // this.$elem.append('<p>'+msg+'</p>');
      },                                        //<---- missing ,
      myQuestion: function ( msg ) {
        /* ========================= */
        /* This doesn't seem to work */
        /* ========================= */
        this.myMethod( msg );
      }
    };
    
    myObject.myQuestion()
    &lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

    【讨论】:

      【解决方案2】:

      除了缺少的“,”,它只会导致语法错误而不是运行时错误。它完美地工作。只是下面的对象的简单形式,它工作正常。

      var myObject = {
        myMethod: function( msg ){
          console.log("myMethod triggered " + msg);
      
        },
        myQuestion: function ( msg ) {
          this.myMethod( msg );
        }
      };
      
      myObject.myQuestion("from myQuestion");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-09
        • 1970-01-01
        • 2023-03-22
        • 2015-03-19
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        相关资源
        最近更新 更多