没有调用原型方法

时间:2014-07-10 09:11:52

标签: javascript jquery oop

我在点击时创建了一个自定义对象,然后尝试访问它的原型方法。

$(function(){       
    $('.addtask').on("click", function(){
        var new_task = new Task();

        $('.deletetask').on("click", function(){
            new_task.deleteTask();
        });

        function Task(){        
         this.html="<li>Add Description<span class='deletetask'></span></li>";
        }

        Task.prototype = {
            constructor: Task,
            deleteTask: function(){
                this.remove()
            },
        }

    });     
});

现在,当我点击类deleteTask时,它说:

TypeError: new_task.deleteTask is not a function


new_task.deleteTask();

如何访问原型方法deleteTask()??

2 个答案:

答案 0 :(得分:3)

您在创建Task 之后设置了new Task 的原型。您不是通过这样做来更改已创建实例的原型,因为在创建实例时会引用原型。

移动Task.prototype = {分配,然后创建new Task

如果您真的想在创建后为所有实例添加一个函数,请更改构造函数的原型而不是替换它:

Task.prototype.deleteTask = function(){...

答案 1 :(得分:1)

您应该在初始Task调用之前移动prototype及其.on方法的定义。这将偶然解决@dystroy所识别的问题,即您在创建实例后尝试设置Task的原型。

如上所述,每次调用单击处理程序时都会重新创建Task函数,因此每次单击时创建的Task对象将是不同类的实例,使用prototype没有实际意义。原型方法是在多个实例之间共享方法和实现继承的有效方法,但是你没有使用它们。

或者,将Task函数保留在原来的位置,但放弃使用prototype方法,例如:

function Task() {        
    this.html = "<li>Add Description<span class='deletetask'></span></li>";

    this.removeTask = function() {
        this.remove();
    }
}

(注意:this.remove此时也未定义?)