【发布时间】:2013-08-12 10:47:47
【问题描述】:
背景
所以,几个月前我看到了一篇文章Essential jQuery Plugin Patterns。我正在尝试编写一个简单的 jQuery 插件,我发现这篇文章非常有用。它包含很多信息,其中大部分超出了我对 JavaScript 或 jQuery 的专业知识。主要感兴趣的是第一个插件模板,称为 jQuery Lightweight Plugin Boilerplate,几个月前我在 another question 中引用了它。
最近,我开始使用 CoffeeScript 并查找了一个 CoffeeScript jQuery 插件模板,我找到了 here。
这两者都实现了几乎相同的概念。这里有一些重要的不同之处:
- Lightweight Boilerplate 中没有的 private 对象
-
CoffeeScript 模板中不同的命名空间块。 (我完全不知道他对
methods[method].apply this, Array::slice.call(arguments, 1)做了什么,虽然我有点理解 Lightweight Boilerplate 的命名空间块。 - 在 Lightweight Boilerplate 中,可在命名空间块中处理对象的链接性和迭代,而在 CoffeeScript 模板 中,
method.init()需要return $(this)以及这样做$(this).each()。
研究
所以我继续拼接这两个。我写了自己的模板。就是这样:
(($, window, document) ->
# ---------------------------------------------------------------------------
# Conventionally private variables
# ---------------------------------------------------------------------------
_PluginName = "FooBar"
_Defaults =
property: 'value' # etc. etc.
# ---------------------------------------------------------------------------
# Private methods
# ---------------------------------------------------------------------------
_Debug = (msg) ->
window.console.log(msg)
return
# ---------------------------------------------------------------------------
# Plugin Constructor
# ---------------------------------------------------------------------------
Plugin = (element, options) ->
@element = element
@options = $.extend true, {}, _Defaults, options
# TODO: Call methods to do stuff
return
# ---------------------------------------------------------------------------
# Plugin Methods
# ---------------------------------------------------------------------------
Plugin.prototype.init = () ->
# TODO: Plugin initializiation logic
return
Plugin.prototype.destroy = () ->
# TODO: Cleanup, unbind and eject
return
# ---------------------------------------------------------------------------
# Actual plugin body
# ---------------------------------------------------------------------------
$.fn[_PluginName] = (options) ->
return @.each () ->
($.data @, 'plugin_' + _PluginName
new Plugin @, options
) unless $.data @, 'plugin_' + _PluginName
return
) jQuery, window, document
我并不是要对这两个插件进行比较。而且我的插件还不够完美。我从对another question 的回答中发现,使用($, window, document) 闭包是一种矫枉过正。可能还有其他问题,欢迎大家指出并讨论。
不过,我有一些非常具体的问题。
问题
这些传统上的“私有”对象/方法有多安全。如果有人故意打电话给
Plugin()而不是正确使用插件怎么办?_Defaults可以在这个闭包之外的任何范围内访问吗?这些“私有”对象的具体范围是什么?它们是否会随意漂浮在 jQuery 命名空间中?他们能干涉任何事情吗?使用这些“私有”变量如何帮助改进代码?
我不完全理解
prototype。init()和destroy()是Plugin()本身的属性吗?为什么init()和destroy()将Plugin()的options属性引用为this.options,就好像init()和destroy()是在Plugin()本身的上下文中定义的......如果我有一个对象定义为Plugin.prototype.methods?this对 insidemethods对象的函数是什么?
注意:如果任何人都难以通过链接查看代码,请告诉我。我将编辑此问题以包含代码。我没有包括在内,因为那样问题会变得太长。
【问题讨论】:
标签: design-patterns jquery-plugins coffeescript