我遵循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代码吗?
答案 0 :(得分:0)
将内部实例变量或函数重命名为其他名称。您将遇到名称空间冲突。当您写时:
Task.prototype.completed
这类似于写作
this.completed = ...
声明之后,所有新创建的Task对象都使用原型。但是,您已经定义了一个名为this.completed
的实例变量。
因此,如果将内部实例变量命名为this._completed
或类似的名称,则代码将按预期运行。