0

次のようにうまく動作します。

function A() {
}

A.prototype.f1 = function() {
  alert('f1');
};

A.prototype.f2 = function() {
  // calls f1
  A.prototype.f1();
};

var a = new A();
a.f2(); // alert f1 correctly

ただし、 A をウィンドウスコープに対して未定義にする関数 B がありますが、 B スコープ内でアクセスできます。

function A() {
}

A.prototype.f1 = function() {
  alert('f1');
};

A.prototype.f2 = function() {
  // calls f1
  A.prototype.f1();
};

function B() {
  var PrivateA = null;

  this.makePrivate = function() {
    PrivateA = A;     // private access
    A = undefined;        // undefined with window object
  };

  this.callA = function() {
    var a = new PrivateA();
    a.f2();               // it calls A.prototype.f1();, but A is undefined now
  };
}

var b = new B();
// expect to accessible
var a = new A();

b.makePrivate();
// expect to inaccessible to window
alert(typeof A);         // expect to be 'undefined'
b.callA();               // expect to alert 'f1', which not works now since A is undefined

B が呼び出される前に A にアクセスできるようにし、B が呼び出されたときに A にアクセスできないようにします。

アドバイスをお願いします。

4

1 に答える 1

0

B次のように設定できます。

function B() {
    var PrivateA;  // It's not accessible from outside of B's scope

    this.makePrivate = function() {
        PrivateA = A;  // Still in B's scope, so it works
        A = undefined;
    };

    this.callA = function() {
        var a = new PrivateA();  // So is this
        a.f2();
    };
}

実行すると次のようになります。

> var b = new B();
> A
function A() {
    this.f1 = function() {
        alert('f1');
    };

    this.f2 = function() {
        // calls f1
        this.f1();
    };
}
> b.makePrivate();
> A
undefined
> b.callA();  // I get an alert that says 'f1'
于 2013-01-16T06:52:41.120 に答える