不使用 jQuery,我想知道如何模仿 jQuery 插件
例如,可能 $('div.x').plugin() 将 onclick 附加到 div,并递增并显示内部值。
jQuery 实际上将带有内部变量的对象存储在哪里?
对象是否在某处显式创建并与每个节点关联?
我试图向自己解释为什么在主应用程序列表中没有明确的对象创建......必须以某种方式在插件中发生?
(PS:我不太关心查询引擎方面......只是插件方面:)
谢谢
不使用 jQuery,我想知道如何模仿 jQuery 插件
例如,可能 $('div.x').plugin() 将 onclick 附加到 div,并递增并显示内部值。
jQuery 实际上将带有内部变量的对象存储在哪里?
对象是否在某处显式创建并与每个节点关联?
我试图向自己解释为什么在主应用程序列表中没有明确的对象创建......必须以某种方式在插件中发生?
(PS:我不太关心查询引擎方面......只是插件方面:)
谢谢
通常你定义一个函数,比如plugin()
写
$.fn.plugin = ...
正如这里所讨论的,$.fn
实际上只是一个捷径jQuery.prototype
。当您将方法附加到构造函数的原型时,JavaScript 会自动将其附加到使用关键字从该构造函数创建的所有实例上new
,当您编写类似$('li')
. 请参阅http://javascriptweblog.wordpress.com/2010/06/07/understanding-javascript-prototypes/。
所以这里有一个简单的例子来创建一个名为kQuery
CoffeeScript 的库,它允许你 1)创建命名实例和 2)添加插件:
instances = {}
kQuery = (name) ->
K = (name) ->
return instances[name] if instances[name]
instances[name] = new kQuery name
K.fn = kQuery.prototype
而已!现在如果有人要写
K.fn.plugin = -> console.log 'foo'
K('whatev').plugin()
他们会foo
在他们的控制台上看到。请注意,使用单独的kQuery
和K
函数的原因是,如果您new K
从K
函数内调用,您会得到一个无限循环(这将解决一个错误)。