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");
};
This.prototypeは存在しますか?
いいえ。ただし、this.constructor.prototype
は必要です。
Class(.constructor).prototypeと同じですか?
通常、値は同じですが(this.constructor === Class
である限り)、意図は同じではありません。
相続はどうですか?
各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
this.prototypeは、クラスオブジェクトのそのインスタンスを参照します。範囲があるため、あまりメリットはありません。
Class.prototypeは、クラスのインスタンスではなく、クラスに機能を追加しています。
Class
は関数です。 this
はオブジェクトです。関数にはprototype
プロパティがあります。オブジェクトはそうではありません。あります __proto__
プロパティはオブジェクトで定義されていますが、そのインターフェイスは非推奨です。あなたは次のようなことをすることができます
function Class () {
var prototype = Object.getPrototypeOf(this);
prototype.method = function () {};
}
コンストラクター内ですが、これはあまり良い方法ではありません。Class
がインスタンス化されるたびに、プロトタイプでmethod
を上書きするサイクルが不必要に無駄になり、コードがより複雑な場合は、メモリが無駄になる可能性があります。同じように。
要するに、そのようにすることには、良い面も、おそらく深刻な悪い面もありません。