2010-05-13 184 views
2

我一直在搞乱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 
} 

上面的代码示例只是放在一起,只是意味着将想法传达给您。无论如何,有没有更好的方法来做到这一点?

+0

@stereofrog:这就是我一直在寻找的,谢谢!你会把它添加为答案,所以我可以接受它吗? – Mottie 2010-05-13 19:28:48

+0

如果你打算采用函数的方法来获得当前的长度,我仍然在默认对象之外添加函数,所以你可以把函数调用运算符'()'放在最后,让你可以像访问属性一样访问'defaults.listLen'(就像在jQuery对象上调用.length一样)。我会更新我的答案,但随时接受stereofrog的答案,因为他指出了这种方法。 – user113716 2010-05-13 19:49:40

回答

1

我要说的这个版本,您张贴,但无需初始化listLen0

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对象上。

+0

感谢帕特里克,你是对的,我会在你的原始答案中使用该方法,以尽量减少函数调用的次数。感谢所有的反馈! – Mottie 2010-05-13 21:44:57

相关问题