“类”定义内部或外部的原型函数有什么区别

时间:2012-12-02 18:26:34

标签: javascript methods prototype

  

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

谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

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

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

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