是否可以在同一个对象内引用对象?
我一直在搞乱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
对象的初始化以外的功能,让您可以添加函数调用运算符。 ()
末,并调用它像一个属性。
var x = function(options){
var defaults = {
ulist: $('ul#list')
}
defaults.listLen = function() {return defaults.ulist.children().length}();
}
现在您可以访问defaults.listLen
像一个属性并获得函数调用的结果,有点像调用.length
在jQuery对象上。
感谢帕特里克,你是对的,我会在你的原始答案中使用该方法,以尽量减少函数调用的次数。感谢所有的反馈! – Mottie 2010-05-13 21:44:57
Mike Alsup的jQuery插件开发模式已经有几年了,但已经老化,并且仍然是插件开发的一个很好的起点。
http://www.learningjquery.com/2007/10/a-plugin-development-pattern
感谢您的回复,但并未回答哪种方法最好,或者上述示例是我唯一的选择。 – Mottie 2010-05-13 17:54:59
@stereofrog:这就是我一直在寻找的,谢谢!你会把它添加为答案,所以我可以接受它吗? – Mottie 2010-05-13 19:28:48
如果你打算采用函数的方法来获得当前的长度,我仍然在默认对象之外添加函数,所以你可以把函数调用运算符'()'放在最后,让你可以像访问属性一样访问'defaults.listLen'(就像在jQuery对象上调用.length一样)。我会更新我的答案,但随时接受stereofrog的答案,因为他指出了这种方法。 – user113716 2010-05-13 19:49:40