可能重复:
Use of ‘prototype’ vs. ‘this’ in Javascript?
Defining prototype methods inside the constructor
这两个定义之间有什么区别吗?
function Task(description, value) {
this.id = 0;
this.subId = 0;
this.parent = null;
this.children = new Array();
this.description = description;
this.value = value;
Task.prototype.getNextId = function () {
return this.subId++;
},
Task.prototype.addTask = function (task) {
task.id = this.getNextId();
this.children[task.id] = task;
task.parent = this;
},
Task.prototype.remove = function () {
this.parent.children.remove(this.id);
}
}
所有原型方法都在Task定义中,或者?
function Task(description, value) {
this.id = 0;
this.subId = 0;
this.parent = null;
this.children = new Array();
this.description = description;
this.value = value;
}
Task.prototype.getNextId = function () {
return this.subId++;
},
Task.prototype.addTask = function (task) {
task.id = this.getNextId();
this.children[task.id] = task;
task.parent = this;
},
Task.prototype.remove = function () {
this.parent.children.remove(this.id);
}
我不确定是否存在差异。从OOP视图看,内部定义看起来更好。
谢谢!
答案 0 :(得分:0)
每次调用构造函数时,第一个都会分配原型函数。因此,如果您稍后在其他地方重新分配它们,则每当您构造该类型的另一个基础对象时,它们将再次被覆盖。这几乎总是不受欢迎的。
有关更详细的讨论,请参阅此问题:Defining prototype methods inside the constructor
答案 1 :(得分:0)
构造函数的prototype
是在构造函数中创建的实例之间共享的对象。
如果更新构造函数中prototype
对象的属性,则共享该原型对象的所有实例都将引用最新更新。
在您的代码中,您不会注意到差异,但它仍然是错误的。没有必要用新的相同版本覆盖原型函数。
如果您的代码发生更改,以便在构造函数中添加prototype
引用局部变量的函数,则所有实例最终都将使用引用最新调用中的变量的prototyped函数。这几乎不是你想要的。
如果您的代码发生更改,以便覆盖构造函数的整个原型对象,那么创建的每个实例都将引用不同的原型对象,并且您无法通过添加新的实例来更新所有实例的原型Task.prototype
的方法,因为它只是更新最新实例的原型对象。