使用JQuery扩展对象,Object没有方法错误

时间:2011-08-21 21:31:37

标签: javascript jquery

我有这个javascript代码:

var TodoController = {

  init: function() {

    $(this).find('input.todo_check').click(function(){
      $(this).parents('li.todo').done();
    });

  }    
}

var Todo = {
  done: function() {
    $(this).toggleClass('done');
  }
}

$(document).ready(function() {

  $("li.todo").extend(Todo);  
  $("#todo_list").extend(TodoController).init();

});

当我点击'input.todo_check'时,我希望在'li.todo'上执行done()函数。但我明白了:

=>未捕获的TypeError:对象[object Object]没有方法'done'

我做错了什么?

此语句应将“done()”函数添加到“li.todo”元素?:

$("li.todo").extend(Todo);  

感谢。 JM

1 个答案:

答案 0 :(得分:1)

每当您拨打$(x)(任何x)时,您都会获得一个全新的对象。所以这两个陈述:

var $x1 = $("li.todo");
var $x2 = $(this).parents('li.todo');

产生两个完全不同的对象。所以,如果你这样做:

var $x1      = $('li.todo');
$x1.where_is = 'pancakes house?';

然后再这样做:

var $x2 = $(this).parents('li.todo');

即使$x2where_is都解析为同一组DOM对象,$x1也不会有$x2属性。

此外,$.extend的行为与您的想法不同。调用extend将对象合并到第一个对象中。所以说:

$(x).extend(Todo);

只返回Todo而不更改任何内容,而是:

$(x).extend(Todo, { where_is: 'pancakes house?' });

where_is添加Todo属性并返回修改后的Todo。这就是为什么你经常看到这样使用的extend

options = $.extend({ }, defaults, options);