9

このモジュールの別のインスタンスを作成しようとすると、機能しません。

シングルトンのようです。一度に1つのインスタンスしか持てません。

コンストラクター関数publik()がインスタンスにのみ持つように制限するメカニズムは何ですか?

http://jsfiddle.net/AVxZR/

var Module = ( function ()
{
    var publik = function ( )
    {
    };
    publik.prototype.test;
    publik.prototype.get = function()
    {
        document.getElementById( 'a'+test ).innerHTML = test;
    };
    publik.prototype.set = function( value )
    {
         test = value;
    };
    return publik;
} ) ();

var object1 = new Module();
var object2 = new Module();

object1.set('1');
object2.set('2');


object1.get();
object2.get();
4

4 に答える 4

9

モジュールパターンは、説明した方法で使用するためのものではありません。これは、1つのモジュールを作成し、外部コードから状態を非表示にするために使用されます。つまり、外部コードが通信できる1つのパブリックインターフェイスを公開し、残りは非表示のままにします。

これにより、名前を変更すると壊れてしまうため、他のコードが内部で使用している変数や関数に依存するのを防ぎます。

また、モジュールはシングルトンであると想定されています。複数の同一のモジュールを持つことは、コードに2つの同一のクラスがあるようなものです...意味がありません。

これは、モジュールパターンがどのように見えるかです。

var Module = (function($) {
    // the $ symbol is an imported alias

    // private variable
    var id = 0;

    // private function
    function increaseId()
    {
        return ++id;
    }

    // return public interface
    return {
        nextId: function() {
            // we have access to the private function here
            // as well as the private variable (btw)
            return increaseId();
        }
    }
}(jQuery)); // we import jQuery as a global symbol

Module.nextId(); // 1
Module.nextId(); // 2
Module.id; // undefined
Module.increaseId(); // error

どのよう.nextId()に公開されるかがわかりますが、他のプライベート変数/関数は公開されていません。

于 2012-05-23T14:59:55.723 に答える
6

簡単な答え:閉鎖。

長い答え(私がそれを正しければ、私が訂正できるようにコメントしてください):

  1. Module varは、スクリプトがロードされるとすぐに実行されます。(関数を囲む括弧で示されます。)()

  2. そのモジュールでは、publik varが宣言され、関数が完了してもクロージャーに残されます。

  3. 以降の呼び出しでは、自動実行された1つのモジュールに引き続きアクセスできます。そして、それは常に同じクロージャスペースと関数スコープと同じオブジェクトを取得します-つまり、publik変数は実際には常に同じものです。

于 2012-05-21T19:28:28.980 に答える
4

Moduleクラスを書き直して、さまざまなインスタンスを作成できるようにしてください。私が変更したので、「test」プロパティを静的プロパティに変更することをお勧めします。

var Module = function(){}

    Module.prototype.test;
    Module.prototype.get = function()
    {
       document.getElementById( 'a'+this.test ).innerHTML = this.test;
    };
    Module.prototype.set = function( value )
    {
       this.test = value;
    }
于 2012-05-21T19:28:11.977 に答える
1

コードはシングルトンを作成しません。test変数はグローバル変数であるため、シングルトンのようにのみ機能します。

この変更を修正testthis.testて、変数が各インスタンスにアタッチされるようにします。

于 2017-06-05T02:05:48.450 に答える