1

したがって、ライブラリを作成するときは、通常、次の方法で行います。

var myLib = (function() {
    return {
        publicProperty: 'test',
        publicMethod: function() {
            console.log('public function');
        },
        anotherMethod: function() { //... },
        // .. many more public methods
    };
}());

次のように書くと、ライブラリの作成が高速になり、初期化に使用するメモリが少なくなるということを耳にしました。

var MyLib = function() {
   this.publicProperty = 'test';
};

MyLib.prototype = {
    publicMethod: function() {
        console.log('public method');
    },
    anotherMethod: function() { //... },
    // ... many more public methods
};

myLib = new MyLib();

一方が他方よりも速く初期化されますか? 私の質問は意味がありますか?これらは同じタスクを達成すると仮定します (そのタスクはmyLib.publicMethod()、docready のコードの別の場所に行って使用します)。ありがとう!

4

2 に答える 2

2

2 つのスクリプトは異なる結果を生成します。

最初にmyLib、3 つ (またはそれ以上) のプロパティを持つオブジェクトを作成します。その原型はObject.prototype. ポイントは、1 つのオブジェクトを作成したことです。

2 番目に、 というグローバル変数を作成しますpublicProperty。これはおそらくあなたが望んでいたものではありません。(編集:OPの質問が修正されました。これはもはや問題ではありません。)

それでも、プロトタイプでメソッドを使用してオブジェクトを作成するつもりだったと仮定すると、プロトタイプでメソッドを呼び出すには、オブジェクトからプロトタイプへのリンクをたどる必要があるため、単純な JavaScript エンジンではおそらくコードが遅くなります。

単一のインスタンスを作成するのではなく、多数のインスタンスを作成することが目的である場合myLibは、プロトタイプにメソッドを配置することで多くのメモリを節約できます。これは、各関数のコピーが 1 つになるためです。何千ものメソッドのコピーは必要ありません。:)

OP の質問に対処するために編集:

2つのアプローチと、最初のアプローチを「高速」にする方法について:

理論的には、時空間のトレードオフがあります。メソッドをオブジェクトに直接配置すると、プロトタイプ チェーンのルックアップがなくなります。ただし、欠点は、すべてのインスタンスが独自のメソッドのコピーを持っていることです。複数のインスタンスを作成する場合は、各メソッドを一度定義してプロトタイプに配置する必要があります。最新の (V8 クラスの) JavaScript エンジンは、この種の処理に非常に優れているため、メソッドをオブジェクトに詰め込んで速度を最適化しようとするべきではありません。次に、シングルトンの場合は、オブジェクトを埋めてください。もう 1 つの方法は、すべてのメソッドをmyLibそれ自体に入れ、 でインスタンスを作成することObject.create(myLib)です。これにより、myLibそれ自体がすべての「インスタンス」のプロトタイプであり、一般的に良い形式と見なされます (少なくとも、「良い部分」の提案に従う場合は、私は通常そうします)。

于 2011-07-23T04:44:54.257 に答える
2

編集:質問の変更を見て、私はあなたに尋ねます:

  • ライブラリの複数の「インスタンス」を同時に持つ予定はありますか?

そうしないと、コンストラクターを使用する利点がわかりません。オブジェクトが 1 つしかないため、そのプロトタイプでプロパティを定義する意味がありません。とにかく、単一のオブジェクトで定義および使用されます。

継承の使用は、複数のオブジェクト インスタンスが必要な場合に役立ちます。メソッドは共有され、再利用され、プロトタイプ チェーンの上位で 1 回だけ宣言されます。


2 番目の例にはいくつかの問題があります。

var myLib = (function() {
   this.publicProperty = 'this';
}());

myLib変数には、-関数式から何も返さない-だけが含まれ、undefinedグローバルpublicPropertyオブジェクトのプロパティとして定義されます。これは、この関数を実行する方法で、thisグローバル オブジェクトにバインドされるためです。

また、コードがstrict mode内で実行される場合、その場合のthis値は にundefinedなり、プロパティ アクセス式は -a 良いこと IMO をスローします。これは、メンバーとしてTypeError宣言したくないと確信しているためです。publicPropertyグローバル オブジェクトの。

myLib.prototype = {
    publicMethod: function() {
        console.log('public method');
    },
    anotherMethod: function() { //... },
    // ... many more public methods
};

prototypeここのプロパティにアクセスすると失敗します-覚えておいmyLibてくださいundefined-.

は、コンストラクター関数(演算子で使用することを意図した関数) で使用されるfunctionsprototypeに対してのみ意味があります。そのプロパティを、すべてのオブジェクトが持つ内部プロパティと混同していると思います。new[[Prototype]]

prototype非関数オブジェクトで名前が付けられたプロパティを定義しても効果はありません。

以下も参照してください。

于 2011-07-23T04:51:30.360 に答える