是否可以在同一对象中引用对象?
我一直在搞乱jQuery插件代码,我试图将所有常见变量放到一个对象中以便于访问。 我在下面列举了一些关于我是如何做到这一点的例子,但我想知道别人如何处理这个问题。
让我们说我有这个
var x = function(options){ var defaults = { ulist : $('ul#list'), listLen : $('ul#list').children().length } $.extend(options, defaults); // do other stuff }
我要做的是使用ulist
对象作为基础,然后找到li
的数量
我想我可以这样做:
var x = function(options){ var defaults = { ulist : $('ul#list'), listLen : 0 } defaults.listLen = defaults.ulist.children().length; $.extend(options, defaults); // do other stuff }
或这个:
var x = function(options){ var defaults = { ulist : $('ul#list') }; var defaults2 = { listLen : defaults.ulist.children().length } $.extend(defaults, defaults2); $.extend(options, defaults); // do other stuff }
上面的代码示例只是拼凑在一起,只是为了让你的想法得到解决。 无论如何,还有更好的方法吗?
我会说你发布的这个版本,但不需要将listLen
初始化为0
。
var x = function(options){ var defaults = { ulist : $('ul#list'), listLen : 0 // Remove this line } defaults.listLen = defaults.ulist.children().length; $.extend(options, defaults); // do other stuff }
编辑:
你的第二个解决方案也可以工作,但不需要对$.extend()
进行两次调用。 它可以接受多个对象。
$.extend(options, defaults, defaults2);
你的第一个解决方案似乎仍然更
编辑:
(正如所指出的,你可以使用一个函数。虽然我仍然在defaults
对象的初始化之外分配函数,所以你可以在最后添加函数调用operator ()
,并像一个属性一样调用它。
var x = function(options){ var defaults = { ulist: $('ul#list') } defaults.listLen = function() {return defaults.ulist.children().length}(); }
现在你可以像属性一样访问defaults.listLen
并获取函数调用的结果,就像在jQuery对象上调用.length
一样。
Mike Alsup的jQuery插件开发模式已有几年历史,但已经老化了,并且仍然是插件开发的一个很好的起点。
http://www.learningjquery.com/2007/10/a-plugin-development-pattern