是否可以在同一个对象中引用对象?

时间:2010-05-13 17:45:29

标签: javascript jquery

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

上面的代码示例只是拼凑在一起,只是为了让你的想法得到解决。无论如何,还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我会说您发布的此版本,但无需将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并获取函数调用的结果,就像在jQuery对象上调用.length一样。

答案 1 :(得分:0)

Mike Alsup的jQuery插件开发模式已有几年历史,但已经老化了,并且仍然是插件开发的一个很好的起点。

http://www.learningjquery.com/2007/10/a-plugin-development-pattern