我一直在研究jQuery插件。插件会像您期望的那样扩展$.fn
。但是,该插件还定义了一个对象供它使用。对象定义如下..
$.MyObj = function() {
}
$.MyObj.prototype.foo = "green";
为什么要将对象定义设为$
的属性?为什么不直接定义对象?
MyObj = function() {
}
MyObj.prototype.foo = "green";
将对象定义设为$
的属性是否有任何好处?
答案 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插件扩展$.fn[pluginName]
,其他jQuery插件是额外的函数(如$.each
,$.ajax
和$.extend
),还有一些扩展jQuery的选择器功能。它们中的每一个都经常需要全局持久性数据,无论是默认值,实用函数还是有什么用。
创建$.fn.foo
的插件可能还希望$.foo.defaultSettings
具有持久性和可扩展性。
就优势而言,向jQuery
对象添加jQuery插件可减少全球污染,我不知道有谁喜欢污染。
答案 1 :(得分:0)
许多javascript库(如jquery)都试图不“污染”全局命名空间。原因是如果多个库,或者一个库和网页本身使用相同的全局变量名,那么可能会破坏另一个。对于像jquery一样广泛采用的东西,这很可能会引发冲突。即使是插件,这也是一种不好的做法。
实际上,同样的问题可能发生在jquery对象本身内部,所以插件实际上甚至不应该设置$ .MyObj,(如果另一个插件做同样的话怎么办?),但我想作者认为它不那么糟糕