对于jQuery插件,为什么要将对象定义添加到$而不是全局?

时间:2011-08-26 20:15:08

标签: jquery jquery-plugins

我一直在研究jQuery插件。插件会像您期望的那样扩展$.fn。但是,该插件还定义了一个对象供它使用。对象定义如下..

$.MyObj = function() {

}

$.MyObj.prototype.foo = "green";

为什么要将对象定义设为$的属性?为什么不直接定义对象?

MyObj = function() {

}

MyObj.prototype.foo = "green";

将对象定义设为$的属性是否有任何好处?

2 个答案:

答案 0 :(得分:1)

一般插件公约

一个优秀的插件设计师通常会创建非常小的全球足迹。如果提供了可重用的对象或功能,则需要从某个地方访问它。

通常,这是通过添加包含必要功能的单个全局对象(或 必要的功能)来完成的。

示例:如果正在向页面添加插件foo.js,您可以预期它会添加

window.foo = {};
//or
window.foo = function(){};

任何开发人员使用两个脚本/path/to/foo.js/different/path/to/foo.js并希望它们能够很好地协同工作,因为它们可能共享相同的命名空间。

然而,使用jQuery插件,插件需要 jQuery。因此,当您可以保证jQuery对象存在时,没有理由污染全局命名空间。

正如(根据定义)jQuery插件需要jQuery,插件的建议命名约定是jQuery.[plugin name].js。就像普通的插件一样,开发人员使用两个脚本/path/to/jQuery.foo.js/different/path/to/jQuery.foo.js并希望它们能够很好地协同工作是愚蠢的。

jQuery细微差别

一些jQuery插件扩展$.fn[pluginName],其他jQuery插件是额外的函数(如$.each$.ajax$.extend),还有一些扩展jQuery的选择器功能。它们中的每一个都经常需要全局持久性数据,无论是默认值,实用函数还是有什么用。

创建$.fn.foo的插件可能还希望$.foo.defaultSettings具有持久性和可扩展性。

就优势而言,向jQuery对象添加jQuery插件可减少全球污染,我不知道有谁喜欢污染。

答案 1 :(得分:0)

许多javascript库(如jquery)都试图不“污染”全局命名空间。原因是如果多个库,或者一个库和网页本身使用相同的全局变量名,那么可能会破坏另一个。对于像jquery一样广泛采用的东西,这很可能会引发冲突。即使是插件,这也是一种不好的做法。

实际上,同样的问题可能发生在jquery对象本身内部,所以插件实际上甚至不应该设置$ .MyObj,(如果另一个插件做同样的话怎么办?),但我想作者认为它不那么糟糕