web-dev-qa-db-ja.com

Class.prototype.methodとthis.prototype.method

Class.prototype.methodの例は常に見ましたが、this.prototype.methodのインスタンスは見たことがありません。例えば:

function Class() {
    this.prototype.method = function() {
        alert("is this allowed?");
    };
}

vs

function Class() {}
Class.prototype.method = function() {
    alert("traditional example");
};
  1. This.prototypeは存在しますか?
  2. Class.prototypeと同じですか?
  3. 相続はどうですか?
23
00500005
  1. This.prototypeは存在しますか?

    いいえ。ただし、this.constructor.prototypeは必要です。

  2. Class(.constructor).prototypeと同じですか?

    通常、値は同じですが(this.constructor === Classである限り)、意図は同じではありません。

  3. 相続はどうですか?

    new ClassインスタンスはClass.prototypeから継承します。したがって、prototypeオブジェクトは、すべてのインスタンスがアクセスできる共有値を定義するのに適しています。次に、コンストラクターは、各インスタンスに固有の状態をセットアップする必要があります。

    ただし、2を組み合わせてコンストラクター内でprototypeプロパティを設定しようとすると、最初のインスタンスが作成されるまでメソッドが存在しないため、鶏が先か卵が先かが競合するなど、いくつかの問題が発生します。

    function Class() {
        this.constructor.prototype.method = function () {};
    }
    
    console.log(typeof Class.prototype.method); // "undefined"
    
    var a = new Class();
    
    console.log(typeof Class.prototype.method); // "function"
    

    また、インスタンスを追加するたびにメソッドが再作成されるため、prototypeを使用する利点の一部が無効になります。

    var method = a.method;
    
    console.log(a.method === method); // true
    
    var b = new Class();
    
    console.log(a.method === method); // false
    
20

this.prototypeは、クラスオブジェクトのそのインスタンスを参照します。範囲があるため、あまりメリットはありません。

Class.prototypeは、クラスのインスタンスではなく、クラスに機能を追加しています。

4
VtoCorleone

Classは関数です。 thisはオブジェクトです。関数にはprototypeプロパティがあります。オブジェクトはそうではありません。あります __proto__プロパティはオブジェクトで定義されていますが、そのインターフェイスは非推奨です。あなたは次のようなことをすることができます

function Class () {
    var prototype = Object.getPrototypeOf(this);
    prototype.method = function () {};
}

コンストラクター内ですが、これはあまり良い方法ではありません。Classがインスタンス化されるたびに、プロトタイプでmethodを上書きするサイクルが不必要に無駄になり、コードがより複雑な場合は、メモリが無駄になる可能性があります。同じように。

要するに、そのようにすることには、良い面も、おそらく深刻な悪い面もありません。

3
user2310967