JavaScript函数不会被调用
javascript function does not get called
我第一次用揭示原型模式编写JavaScript代码。我有问题。当我在用户单击添加按钮时调用添加函数时,它会在控制台中显示此错误。
Uncaught TypeError: Cannot call method 'add' of undefined
如何解决这个问题?
这是我的脚本.js代码
$(function () {
var todo = Todo('contents');
$('.addBtn').on('click', function() {
var name = $(this).parent().find('input[type="text"]').val();
todo.add(name);
});
$('.contents').on('click', '.remove', function() {
var el = $(this).parent();
todo.remove(el);
});
$('.contents').on('click', '.update', function() {
var dom = $(this);
todo.addUpdateField(dom);
});
$('.contents').on('click', '.updateBtn', function() {
var el = $(this);
todo.update(el);
});
});
这是我的待办事项.js代码
var Todo = function(c) {
this.contents = $('.' + c);
};
Todo.prototype = function() {
var showel = function (d) {
this.contents.prepend(d);
},
add = function (name) {
if(name != "") {
var div = $('<div class="names"></div>')
.append('<span>' + name + '</span>')
.append("<button class='update' class='update'>Edit</button>")
.append("<button class='remove' name='remove'>Remove</button>");
}
return showel(div);
},
addUpdateField = function (dom) {
var name = dom.parent().find('span').text(),
field = $('<input type="text" value="' + name + '" />'),
update = $('<button class="updateBtn">Update</button>');
dom.parent().html('').append(field).append(update);
return;
},
update = function(el) {
var val = el.parent().find('input').val();
el.parent().html('<span>' + val + '</span>')
.append('<button class="update" class="update">Edit</button>')
.append('<button class="remove" class="remove">Remove</button>');
return;
},
remove = function (el) {
return el.remove();
};
return {
add : add,
update : update,
remove : remove,
addUpdateField : addUpdateField
};
}();
更新
更改后 var todo = Todo('contents');
自
var todo = new Todo('contents');
我收到此错误
Object [object Object] has no method 'add'
更新 2
这是我在JSFIDDLE上
您没有正确构造对象,因此它没有任何原型:
var todo = Todo('contents');
应该是:
var todo = new Todo('contents');
这是一个SO问题,解释了当您忘记new
时会发生什么。
编辑:您定义原型函数的方式弄乱了上下文(this
指向的内容)。请尝试这样的模式:
Todo.prototype = {
method1: function () { ... },
method2: function () { ... }
};
固定小提琴:http://jsfiddle.net/BagmY/3/
您正在尝试将Todo
的prototype
分配给自调用函数。但是,原型只是分配给一个函数,而不是预期的返回对象。
这是你的工作小提琴。我用你的方法将原型直接分配给一个对象。
此外,JS从上到下解析。因此,在声明Todo
是什么后,定义新的Todo
实例。
自调用函数应该的样子:
Todo.prototype = (function() {
// ...
return {
add: add,
update: update,
remove: remove,
addUpdateField: addUpdateField
};
})();
相关文章:
- 如何从模块链中调用函数.导出到节点中
- 调用函数内部的函数
- 在javascript中调用c函数
- DropDownListFor赢得't在更改时调用函数
- Javascript页面调用函数
- 在动画结束之前调用函数
- 允许父窗口在其不同域的子iframe上调用函数
- 运行Infinite Scroll后调用函数时出现问题
- JavaScript:在调用函数的文本输入上按enter键
- 使用大括号和不使用bracs调用函数的区别
- javascript在事件上调用函数
- 从index.html调用函数,该函数无限循环
- 从带参数的字符串变量调用函数中的函数
- 为什么 JS 不在滚动时调用函数
- 是否可以在不更改上下文的情况下调用函数.apply
- 如何在ES6类中使用参数调用函数
- AngularJS:调用函数时编号不更新
- JavaScript中的立即调用函数表达式(IIFE)-传递jQuery
- 在JavaScript中调用函数时自定义此选项
- 调用函数中声明的变量