使用原型,TypeError:task1.completed不是函数

时间:2018-10-09 15:16:40

标签: javascript design-patterns this javascript-objects prototypejs

我遵循JS设计模式教程,该教程说明了使用原型防止每次我们新建对象时都使用“ this”。但是,当我如下运行代码时,它弹出如下错误。我完全遵循了教程代码,这就是为什么我不明白为什么在教程中没有显示错误的原因。

  

TypeError:task1.completed不是函数

    var Task = function (name) {
        this.name = name;
        this.completed = false;

    }

    Task.prototype.completed = function () {
        console.log('completing task: ' + this.name);
        this.completed = true;
    }


    Task.prototype.save = function () {
        console.log('saving task: ' + this.name);
    }

    var task1 = new Task('create a demo for constructors');
    var task2 = new Task('create a demo for modules');
    var task3 = new Task('create a demo for singletons');
    var task4 = new Task('create a demo for prototypes');

    task1.completed();
    task2.save();
    task3.save();
    task4.save();

我的另一个问题是,如本教程所述,我们应该始终使用这种方式来实现类,但是为什么在很多代码中我都没有看到这种模式?我只看到原型在实现内置方法的JS中的用法,例如。 Object.prototype.toString()。但是在我们的现实生活中,我并没有看到太多。是我不熟悉JS代码吗?

1 个答案:

答案 0 :(得分:0)

将内部实例变量或函数重命名为其他名称。您将遇到名称空间冲突。当您写时:

Task.prototype.completed

这类似于写作

this.completed = ...

声明之后,所有新创建的Task对象都使用原型。但是,您已经定义了一个名为this.completed的实例变量。

因此,如果将内部实例变量命名为this._completed或类似的名称,则代码将按预期运行。