jQuery插件使用揭示原型模式
jQuery plugin using reveal prototype pattern
我正在使用揭示原型模式开发一个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');
问题是您已将原型设置为函数表达式,而不是立即调用的函数表达式。 您需要更改它:
GammadiaCalendar.prototype = (function() {
// your code here
})(); // Execute it
此外,此行将永远不起作用:
GammadiaCalendar.defaults = GammadiaCalendar.prototype.defaults;
因为defaults
永远不会返回到原型中。
揭示原型模式的整个结构不正确。 new GammadiaCalendar(this, options).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');
,因为它没有公开
相关文章:
- jQuery插件使用揭示原型模式
- JS:原型模式兼容性
- 揭示原型模式私有变量
- 在带有敲除和杜兰达尔的揭示原型模式中对“这个”的混淆
- 如何将原型模式引入 javascript 命名空间
- 构造函数模式和原型模式之间的区别
- 显示原型模式不适用于 Array
- 原型模式(调用函数)
- Javascript-如何保存对“;这个“;用于使用原型模式在命名函数回调中进行访问
- 如何添加名称空间来显示原型模式
- 原型模式创建新属性
- Javascript原型模式-反馈
- 正确的Javascript原型模式定义/示例
- 如何在揭示原型模式中命名对象
- 使用原型模式在javascript类中保存实例值
- 这种javascript原型模式的好处是什么?
- 在Knockout JS中使用揭示原型模式的计算观察对象
- 使用私有函数作为回调来揭示原型模式
- 在闭包中使用原型模式
- 为什么组合构造函数/原型模式返回对象类型