javascript – 用于处理私有函数的jQuery插件设计模式(通用实践?)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 用于处理私有函数的jQuery插件设计模式(通用实践?),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3409字,纯文字阅读大概需要5分钟。
内容图文
我一直在开发jQuery插件已有一段时间了,我想我现在知道如何设计好一个.然而,有一个问题一直困扰着我,那就是如何以强大而优雅的方式处理私有功能.
我的插件通常看起来像这样:
(function($) {
$.fn.myplugin = function(...) {
...
// some shared functionality, for example:
this.css('background-color', 'green');
...
};
$.fn.mypluginAnotherPublicMethod = function(...) {
...
// some shared functionality, for example:
this.css('background-color', 'red');
...
};
}(jQuery));
现在我的问题是:如何巧妙地干掉共享功能?一个明显的解决方案是将它放在插件命名空间中的函数中:
var fill = function($obj, color) {
$obj.css('background-color', color);
};
虽然这个解决方案很有效且命名很好,但我真的不喜欢它.原因很简单:我必须传递jQuery对象.即我必须这样称呼:fill(this,’red’);,虽然我想这样称呼它:this.fill(‘red’);
当然,我们可以通过简单地将fill放入jQuery.fn来实现这个结果.但这感觉非常不舒服.想象一下,基于这种方法开发了十个插件,每个插件将五个“私有”函数放入jQuery函数命名空间.它最终陷入了混乱.我们可以通过在每个函数前面加上它们所属插件的名称来缓解这??种情况,但这并没有真正使它更具吸引力.这些函数应该是插件的私有函数,所以我们根本不想将它们暴露给外部世界(至少不是直接暴露).
所以我的问题是:你们中是否有人有关于如何充分利用两个世界的建议.那是;插件代码能够以类似于this.fill(‘red’)(或this.myplugin.fill(‘red’)或甚至this.myplugin()的方式调用’private’插件函数.fill(‘red’)等),同时防止jQuery函数命名空间污染.当然它应该是轻量级的,因为这些私有函数可能会被频繁调用.
更新:感谢您的建议.
我特别喜欢David的定义一个包含’private’函数并包装jQuery对象的对象类型的想法.唯一的问题是它仍然不允许我链接“私人”和“公共”功能.这就是想要像this.fill(‘red’)这样的语法开始的重要原因.
我最终找到了一个我认为不是非常优雅的解决方案,但却吸引了“两全其美”的原因:
$.fn.chain = function(func) {
return func.apply(this, Array.prototype.slice.call(arguments, 1));
};
这允许构造如:
this.
find('.acertainclass').
chain(fill, 'red').
click(function() {
alert("I'm red");
});
我在其他地方交叉发布了我的问题,这也收集了一些有趣的回答:
> http://forum.jquery.com/topic/jquery-plugin-design-pattern-common-practice-for-dealing-with-private-functions
> http://groups.google.com/group/jquery-en/browse_thread/thread/fa8ccef21ccc589a
解决方法:
首先要做的事情是:如果你想打电话给这样的话.填充(‘红色’);这是jQuery的一个实例,你必须扩展jQuery原型并使fill()“公开”. jQuery提供了使用所谓的“插件”扩展它的原型的指南,可以使用$.fn.fill添加它,这与jQuery.prototype.fill相同.
在jQuery回调中,这通常是对HTML元素的引用,并且您无法向那些(还)添加原型.这就是为什么jQuery包装元素并返回可以轻松扩展的jQuery实例的原因之一.
使用(function(){})();语法,你可以动态创建和执行“私人”javascript,当它完成后它们都会消失.使用这种技术,您可以创建自己的类jQuery语法,将jQuery包装到您自己的私有可链接对象中.
(function(){
var P = function(elem) {
return new Private(elem);
};
var Private = function(elem) {
this.elem = jQuery(elem);
}
Private.prototype = {
elem: null,
fill: function(col) {
this.elem.css('background',col);
return this;
},
color: function(col) {
this.elem.css('color', col);
return this;
}
}
$.fn.myplugin = function() {
P(this).fill('red');
};
$.fn.myotherplugin = function() {
P(this).fill('yellow').color('green');
};
})();
$('.foo').myplugin();
$('.bar').myotherplugin();
console.log(typeof P === 'undefined') // should print 'true'
这样,P代表您自己的“私有”功能工具箱.它们将无法在代码中的任何其他位置或jQuery命名空间中使用,除非您将它们附加到某处.你可以在Private对象中添加任意数量的方法,只要你返回它,你也可以像我在示例中那样链接它们jQuery样式.
内容总结
以上是互联网集市为您收集整理的javascript – 用于处理私有函数的jQuery插件设计模式(通用实践?)全部内容,希望文章能够帮你解决javascript – 用于处理私有函数的jQuery插件设计模式(通用实践?)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。