我有这个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
答案 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');
即使$x2
和where_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);