2

重複の可能性:
Javascript での「プロトタイプ」と「これ」の使用?
コンストラクター内でのプロトタイプ メソッドの定義

これら2つの定義に違いはありますか?

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 ビューから見ると、内部の定義がよく見えます。

ありがとう!

4

2 に答える 2

1

コンストラクターのprototypeは、コンストラクターから作成されたインスタンス間で共有されるオブジェクトです。

コンストラクター内のオブジェクトのプロパティを更新すると、prototypeそのプロトタイプ オブジェクトを共有するすべてのインスタンスが最新の更新を参照します。

あなたのコードでは違いに気付かないでしょうが、それでも間違っています。プロトタイプ化された関数を新しい同一バージョンで上書きし続ける必要はありません。

関数prototypeがコンストラクターの参照ローカル変数に追加されるようにコードを変更すると、すべてのインスタンスは、最新の呼び出しで変数を参照するプロトタイプ関数を使用することになります。これはあなたが望むものではありません。

コンストラクターのプロトタイプ オブジェクト全体が上書きされるようにコードが変更された場合、作成された各インスタンスは異なるプロトタイプ オブジェクトを参照することになり、新しいメソッドを に追加してすべてのインスタンスのプロトタイプを更新することはできなくなりますTask.prototype。最新のインスタンスのプロトタイプ オブジェクトを更新するだけです。

于 2012-12-02T18:30:10.093 に答える
0

最初のものは、コンストラクターが呼び出されるたびにプロトタイプ関数を割り当てます。そのため、後でそれらを別の場所に再割り当てすると、そのタイプの別のベース オブジェクトを構築するたびに再度上書きされます。これはほとんどの場合望ましくありません。

より詳細な議論については、この質問を参照してください:コンストラクター内でのプロトタイプ メソッドの定義

于 2012-12-02T18:29:48.640 に答える