3

私がこのコードを持っているとしましょう:

(function(global) {
    function Bar(foo) {
        this.foo = foo;
        return this;
    }

    Bar.prototype.getFoo = function() {
        return this.foo;
    };

    Bar.prototype.setFoo = function(val) {
        return (this.foo = val);
    };
})(this);

setFoowithのような関数を作成することと、次のように実行することの違いは何ですかprototype

function Bar(foo) {
    this.getFoo = function() {
        return this.foo;
    };
}

プロトタイプとは何か、そしてそれが何を意味するのかはわかっていますが、なぜ一部の人がプロトタイプで関数を割り当てるのか理解できません。これを割り当てると、Barの新しいインスタンスを作成するたびにそれらが利用できるようになるからです。

4

4 に答える 4

2

クイックアンサー=機能共有+より小さなメモリフットプリント

prototype.functionNameすべてのインスタンスを使用している場合は同じ関数を共有します(メモリ内に1つのコピーのみ)がthis.functionName、コンストラクターで使用する場合、各インスタンスには同じ関数の独自のコピーがあります(メモリ内に複数回存在します)。

使用prototypeには2つの意味があります。

  1. メモリフットプリント-前述のとおり
  2. プロトタイプでのその後の関数の変更は、既存の(そしてもちろん将来の)すべてのインスタンスに反映されます-これを実行したい場合はまれですが、使用できるものはあります

高度-両方を持つことができます

両方を持つこともできます。その場合、ローカルコピーがプロトタイプよりも優先されます。つまり、次のようなことができます。

function Crazy(name)
{
    this.name = name;
    this.callMe = function() {
        return "Where are you " + this.name;
    };
}

Crazy.prototype.callMe = function() {
    return this.name + " come here";
};

var inst = new Crazy("Robert");
inst.callMe(); // "Where are you Robert"
delete inst.callMe;
inst.callMe(); // "Robert come here"
于 2012-10-19T09:23:05.507 に答える
1

を使用するprototypeと、関数は共有されますが、関数をに割り当てると、共有さthisれません。代わりに、すべてのインスタンスに独自の関数の コピーがあります。

于 2012-10-19T09:22:39.563 に答える
0

脇:

プロトタイプの継承では、独自のプロパティと継承されたプロパティの間に根本的な違いがあります。

これは非常に関連性がある場合があります。

よく使用される古典的なforループは、「独自のプロパティ」のみをチェックし、次の形式を取ります。

for (prop in array) {
if (array.hasOwnProperty(prop)) {
      dostuff
}

に割り当てる場合this、すべてのプロパティは独自のプロパティであるため、hasOwnPropertyチェックは無関係になります。

于 2012-10-19T09:36:17.797 に答える
0

「クラス」のインスタンスが複数ある場合(大まかに用語を使用)、それらはすべて同じプロトタイプを共有します。したがって、そこに物を取り付けると、より軽量になり、すべてが同じバージョンになることが保証されます(それが必要な場合)。

インスタンスフィールドとクラスフィールドの違いと考えてください。

プロトタイプを連鎖させて、フィールドの「継承」を可能にすることもできます。

于 2012-10-19T09:13:38.977 に答える