プロトタイプを使用してメソッドを宣言すると、メソッドが宣言された後にそのインスタンスが作成される限り、いつでもそのプロトタイプのインスタンスでメソッドを使用できることを意味します。
を使用してコンストラクターで宣言することは、メソッドが宣言されたコンストラクターthis.foo = function(){ ... }
内のポイントの後にのみメソッドが使用可能になることを意味します。
簡単な例として、名前付き関数と無名関数を見てみましょう。
以下では、名前付き関数を宣言し、それを 2 回呼び出します。最初の呼び出しが関数の宣言の前であっても、関数は最初の呼び出しから正常に実行されることに注意してください。
foo();
function foo()
{
alert("foo");
}
foo();
ここで、名前付き関数の代わりに、変数に格納された無名関数を使用しますfoo
。この時点では が定義されていないため、最初の呼び出しでエラーが発生することに注意してください。
foo();
var foo = function()
{
alert("foo");
}
foo();
プロトタイプは (概念的に) 同様に機能します。関数のプロトタイプを変更すると、その関数のインスタンスが作成される前に影響を受けます。したがって、以下は正常に機能します。
function f ()
{
this.bar();
}
f.prototype.bar = function()
{
alert("bar");
};
var f1 = new f();
f.prototype.bar
それを呼び出している行の後に物理的に宣言されていることに注意してください。this. ...
それをメソッドと比較してみましょう。以下は期待どおりに動作します
function g()
{
this.h = function(){
alert("h");
};
this.h();
}
var g1 = new g();
this.h
これは、値を割り当てる前に呼び出そうとしているためではありません。
function g()
{
this.h();
this.h = function(){
alert("h");
};
}
var g2 = new g();
ただし、関数のプロトタイプに影響を与えるには、匿名関数をプロトタイプのプロパティに割り当てるメカニズムが引き続き使用されることに注意してください。これが意味することは、プロトタイプ メソッドを使用しても、プロトタイプに関数を追加する前にプロトタイプのインスタンスをインスタンス化すると、エラーが発生する可能性があるということです。たとえば、次のようにするとうまくいきます。
function f ()
{
this.bar();
}
f.prototype.bar = function()
{
alert("bar");
};
var f1 = new f();
var f1 = new f();
しかし、上記の割り当てをに移動するf.prototype.bar
と、エラーが発生します。
function f ()
{
this.bar();
}
var f1 = new f();
f.prototype.bar = function()
{
alert("bar");
};