0

我正在使用显示原型模式开发一个 jQuery 插件,我在实例化我的对象时遇到了一些麻烦。下面,插件的代码:

(function($) {

var GammadiaCalendar = function(elem, options) {
    this.elem = elem;
    this.$elem = $(elem);
    this.options = options;
};

GammadiaCalendar.prototype = function() {

    var defaults = {
        message: 'Hello world!'
    },

    init = function() {

        this.config = $.extend({}, this.defaults, this.options);

        this.displayMessage();

        return this;
    },

    displayMessage = function() {
        alert(this.config.message);
    };

    return {
        displayMessage : displayMessage
    };


};

GammadiaCalendar.defaults = GammadiaCalendar.prototype.defaults;

$.fn.GammadiaCalendar = function(options) {
    return this.each(function() {
        new GammadiaCalendar(this, options).init();
    });
};

})(jQuery)

我在实例化时得到GammadiaCalendar 未定义

var gc = new GammadiaCalendar('id');

4

2 回答 2

1

问题是您将原型设置为函数表达式,而不是立即调用的函数表达式。你需要改变它:

GammadiaCalendar.prototype = (function() {
   // your code here
})(); // Execute it

此外,这条线永远不会起作用:

GammadiaCalendar.defaults = GammadiaCalendar.prototype.defaults;

因为defaults永远不会返回原型。

您揭示原型模式的整个结构是不正确的。由 使用的init函数new GammadiaCalendar(this, options).init()是私有的,因此无法访问。因此,原型需要改成这样:

GammadiaCalendar.prototype = (function() {
  var defaults = {
     message: 'Hello world!'
  },
  init = function() {
    this.config = $.extend({}, this.defaults, this.options);
    this.displayMessage();
    return this;
  },
  displayMessage = function() {
    alert(this.config.message);
  };

  return {
    defaults: defaults,
    init: init,
    displayMessage : displayMessage
  };

})(); 

(当然,通过这种方式,你并没有真正从这种模式中获得任何东西,因为里面不再有真正的私有函数了)。

于 2012-06-28T07:36:53.350 回答
0

我看不出这种模式有什么意义,你可以这样做:

(function($) { //Because of this, everything here is "private" unless exposed anyway

    var defaults = {
            message: 'Hello world!'
    };

    function init() {
        this.config = $.extend({}, defaults, this.options);

        this.displayMessage();

        return this;
    }

    var GammadiaCalendar = function(elem, options) {
        this.elem = elem;
        this.$elem = $(elem);
        this.options = options;
    };

    GammadiaCalendar.prototype = {

        displayMessage: function() {
            alert(this.config.message);
        },

        constructor: GammadiaCalendar
    };


    GammadiaCalendar.defaults = defaults;

    $.fn.GammadiaCalendar = function(options) {
        return this.each(function() {
            var instance = new GammadiaCalendar(this, options);
            init.call(instance);
        });
    };

})(jQuery);

请注意,您不能var gc = new GammadiaCalendar('id');在包含函数之外进行操作,因为它没有公开

于 2012-06-28T07:47:33.923 回答