2

可能重复:
在 Javascript 中使用“原型”与“这个”?
在构造函数中定义原型方法

这两个定义有什么区别吗?

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);
    }

}

所有原型方法都在任务定义中,或者?

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 视图来看,内部定义看起来更好。

谢谢!

4

2 回答 2

1

构造函数的prototype是在从构造函数创建的实例之间共享的对象。

如果您prototype在构造函数中更新对象的属性,则共享该原型对象的所有实例都将引用最新更新。

在您的代码中,您不会注意到差异,但它仍然是错误的。没有必要继续用新的相同版本覆盖原型函数。

如果您的代码发生更改,以便将函数添加到prototype构造函数中的引用局部变量,那么所有实例最终都将使用在最新调用中引用变量的原型函数。这几乎不是你想要的。

如果您的代码发生更改,从而覆盖了构造函数的整个原型对象,那么创建的每个实例都将引用不同的原型对象,并且您将无法通过向 中添加新方法来更新所有实例的原型Task.prototype,因为它只会更新最新实例的原型对象。

于 2012-12-02T18:30:10.093 回答
0

第一个在每次调用构造函数时分配原型函数。因此,如果您稍后将它们重新分配到其他地方,那么只要您构造另一个该类型的基础对象,它们就会再次被覆盖。这几乎总是不受欢迎的。

有关更详细的讨论,请参阅此问题:Defining prototype methods inside the constructor

于 2012-12-02T18:29:48.640 回答