3

私はこれを行う必要がある現実のシナリオを考えるのに苦労しています:

function foo() {};
foo.prototype.myFunction = function() { return something; };

単にこれを行う代わりに:

function foo() { this.myFunction = function() { return something; } };
4

3 に答える 3

1

それが大きな違いを生む良い例は、多くの「foo」オブジェクトをインスタンス化する必要がある場合です。プロトタイプベースのソリューションは、2番目のソリューションよりもはるかに高速で効率的です。

その場合に大きな違いが生じる理由は、2番目の例では、新しいインスタンスごとに新しい関数を作成しており、最初の例では、すべてのオブジェクトが同じ関数を共有しているためです。

パフォーマンスのためにプロトタイプベースの継承を使用する必要がある実際の例は、jQueryのようなライブラリです。重要なWebアプリケーションでは、2000以上のオブジェクトインスタンスが簡単に作成される可能性があります。それらのオブジェクトのそれぞれが独自の機能を持ち、それらを共有しない必要がある場合を想像してみてください。

于 2012-04-06T00:55:24.930 に答える
1

foo(実際には、コンストラクターであるため、大文字にする必要があります;))の2つのインスタンスを作成しましょう。

var myFoo1 = new foo();
var myFoo2 = new foo();

最初のケースでmyFunctionは、fooはのプロトタイプにあるため、メモリ内にこの関数のインスタンスは1つしか存在しません。myFoo1また、myFoo2この関数を別ので呼び出すため、どちらも独自の目的でこの関数を使用できますthis

myFunction2番目のケースでは、のインスタンスが作成されるたびにの新しいコピーが作成fooされます。メモリには複数のインスタンスがあります。

つまり...オブジェクトのメソッド(または読み取り専用のメンバー変数、または単に他の共有のもの)をプロトタイプに入れると、メモリを節約できます。一方、メンバーのルックアップも少し遅くなります。関数はオブジェクトに直接存在しませんが、プロトタイプチェーンの1つ上のステップになります。

于 2012-04-06T01:01:05.377 に答える
1

それを行う必要は決してありませんが、いくつかの長所と短所があります。

  • 利点:プロトタイプ化された関数は、fooコンストラクターから作成されたすべてのオブジェクト間で共有されます。

  • foo欠点:プロトタイプ化された関数は、コンストラクター呼び出しの直接の変数スコープ内の変数に直接アクセスできません。


コンストラクターのを使用する代わりに、prototypeオブジェクトごとに新しい関数を作成せずに、コンストラクターで関数を直接割り当てることもできます。

あなたはこのようにそれを行うことができます...

var foo = (function() {

    var myFunction = function() { return something; };

    return function foo() { this.myFunction = myFunction; };

})();

myFunctionこれには、コンストラクターのスコープ内の変数に明らかにアクセスできないという点で、プロトタイプ関数と同じ制限があります。

于 2012-04-06T01:01:24.287 に答える