私はこれを行う必要がある現実のシナリオを考えるのに苦労しています:
function foo() {};
foo.prototype.myFunction = function() { return something; };
単にこれを行う代わりに:
function foo() { this.myFunction = function() { return something; } };
私はこれを行う必要がある現実のシナリオを考えるのに苦労しています:
function foo() {};
foo.prototype.myFunction = function() { return something; };
単にこれを行う代わりに:
function foo() { this.myFunction = function() { return something; } };
それが大きな違いを生む良い例は、多くの「foo」オブジェクトをインスタンス化する必要がある場合です。プロトタイプベースのソリューションは、2番目のソリューションよりもはるかに高速で効率的です。
その場合に大きな違いが生じる理由は、2番目の例では、新しいインスタンスごとに新しい関数を作成しており、最初の例では、すべてのオブジェクトが同じ関数を共有しているためです。
パフォーマンスのためにプロトタイプベースの継承を使用する必要がある実際の例は、jQueryのようなライブラリです。重要なWebアプリケーションでは、2000以上のオブジェクトインスタンスが簡単に作成される可能性があります。それらのオブジェクトのそれぞれが独自の機能を持ち、それらを共有しない必要がある場合を想像してみてください。
foo
(実際には、コンストラクターであるため、大文字にする必要があります;))の2つのインスタンスを作成しましょう。
var myFoo1 = new foo();
var myFoo2 = new foo();
最初のケースでmyFunction
は、foo
はのプロトタイプにあるため、メモリ内にこの関数のインスタンスは1つしか存在しません。myFoo1
また、myFoo2
この関数を別ので呼び出すため、どちらも独自の目的でこの関数を使用できますthis
。
myFunction
2番目のケースでは、のインスタンスが作成されるたびにの新しいコピーが作成foo
されます。メモリには複数のインスタンスがあります。
つまり...オブジェクトのメソッド(または読み取り専用のメンバー変数、または単に他の共有のもの)をプロトタイプに入れると、メモリを節約できます。一方、メンバーのルックアップも少し遅くなります。関数はオブジェクトに直接存在しませんが、プロトタイプチェーンの1つ上のステップになります。
それを行う必要は決してありませんが、いくつかの長所と短所があります。
利点:プロトタイプ化された関数は、foo
コンストラクターから作成されたすべてのオブジェクト間で共有されます。
foo
欠点:プロトタイプ化された関数は、コンストラクター呼び出しの直接の変数スコープ内の変数に直接アクセスできません。
コンストラクターのを使用する代わりに、prototype
オブジェクトごとに新しい関数を作成せずに、コンストラクターで関数を直接割り当てることもできます。
あなたはこのようにそれを行うことができます...
var foo = (function() {
var myFunction = function() { return something; };
return function foo() { this.myFunction = myFunction; };
})();
myFunction
これには、コンストラクターのスコープ内の変数に明らかにアクセスできないという点で、プロトタイプ関数と同じ制限があります。