1

別のモジュールをインスタンス化し、そのいくつかのメソッドをプロキシする RequireJs モジュールを取得しました。モジュール インスタンス自体を非表示にして、プロキシ メソッド経由のアクセスのみを許可したいと考えています。

define(['mediator'], function(Mediator) {

  var Proxy;

  Proxy = function(prefix) {
    this.prefix = prefix;
    this.mediator = new Mediator();
  };

  Proxy.prototype.on = function(event, callback, context) {
    this.mediator.subscribe(this.prefix + event, callback, context || this);
  };

  Proxy.prototype.off = function(event, callback, context) {
    this.mediator.unsubscribe(this.prefix + event, callback, context || this);
  };

  Proxy.prototype.trigger = function() {
    arguments[0] = this.prefix + arguments[0];
    this.mediator.trigger.apply(this.mediator, arguments);
  };

  return Proxy;

});

require(['proxy'], function(Proxy) {

  var proxy = new Proxy('sample:');

  // this access is secured and bound to the prefix
  // I cannot mess up with other events which do not belong to me
  proxy.on('log', function(message) { console.log(message); });
  proxy.trigger('log', 'hi hello');

  // unfortunately there still would be a hack to leave my event scope
  proxy.mediator.trigger('outerscope:test', 'blabla');

});

ご覧のとおり、プロキシ プロトタイプの内部で使用されているメディエーター オブジェクトにアクセスして、それを台無しにすることが可能です...

どうにかしてメディエーター インスタンスを非表示にしたいのですが、どこにあるのかわかりません。これを requirejs モジュールのコールバック内の通常の変数に格納することもできますが、requirejs ではうまく機能せず、オーバーラップが発生する可能性があります。

それで、他に何ができますか?

アップデート:

define(['mediator'], function(Mediator) {

  var Proxy;

  var mediator = new Mediator();

  Proxy = function(prefix) {
    this.prefix = prefix;
  };

  Proxy.prototype.on = function(event, callback, context) {
    mediator.subscribe(this.prefix + event, callback, context || this);
  };

  Proxy.prototype.off = function(event, callback, context) {
    mediator.unsubscribe(this.prefix + event, callback, context || this);
  };

  Proxy.prototype.trigger = function() {
    arguments[0] = this.prefix + arguments[0];
    mediator.trigger.apply(this.mediator, arguments);
  };

  return Proxy;

});

require(['proxy'], function(Proxy) {

  var proxy = new Proxy('sample:');
  proxy.on('log', function(message) { console.log(message); });

});
4

1 に答える 1

2

これは、Javascript でクロージャ内に変数をカプセル化する典型的な例です。必要なのは、メディエーターのインスタンスを と同じスコープ内のローカル変数として定義することですProxy。これにより、Proxy オブジェクトがMediatorクロージャー経由でアクセスできるようになりますが、定義コールバックの外側のコードからメディエーターが分離されます。このように:

define(['mediator'], function(Mediator) {

    // Make mediator local scope variable
    var mediator = new Mediator(),

    Proxy = function(prefix) {
        this.prefix = prefix;
    };

    Proxy.prototype.on = function(event, callback, context) {
        mediator.subscribe(this.prefix + event, callback, context || this);
    };

    // ... rest of the code

    return Proxy;

});
于 2012-10-20T09:00:35.103 に答える