Javascript 使用揭示原型模式的jQuery插件
我正在使用揭示原型模式开发一个jQuery插件,我在实例化我的对象时遇到了一些麻烦。下面是插件的代码:Javascript 使用揭示原型模式的jQuery插件,javascript,jquery,Javascript,Jquery,我正在使用揭示原型模式开发一个jQuery插件,我在实例化我的对象时遇到了一些麻烦。下面是插件的代码: (function($) { var GammadiaCalendar = function(elem, options) { this.elem = elem; this.$elem = $(elem); this.options = options; }; GammadiaCalendar.prototype = function() { var de
(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=新的GammadiaCalendar('id') 问题是您将原型设置为函数表达式,而不是立即调用的函数表达式。您需要更改它:
GammadiaCalendar.prototype = (function() {
// your code here
})(); // Execute it
此外,这条线永远不会起作用:
GammadiaCalendar.defaults = GammadiaCalendar.prototype.defaults;
因为默认值
永远不会返回到原型
你的原型模式的整体结构是不正确的。new GammadiaCalendar(此选项).init()使用的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
};
})();
(当然,通过这种方式,您并没有从这种模式中真正获得任何好处,因为里面已经没有真正的私有函数了)。我认为这种模式没有任何意义,您可以这样做:
(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')代码>在包含函数之外,因为它没有公开此模式是非常多余的,因为您已经在IIFE中,原型及其构造函数仅在其中可用。