1

私はディアスの本 Pro JavaScript Design Patterns を読んでいます。素晴らしい本。私自身は決してプロではありません。私の質問: プライベート インスタンス変数にアクセスできる静的関数を使用できますか? 私のプログラムにはたくさんのデバイスがあり、あるデバイスの出力を別のデバイスの入力に接続できます。この情報は、入力配列と出力配列に格納されます。これが私のコードです:

var Device = function(newName) {
    var name = newName;
    var inputs  = new Array();
    var outputs = new Array();
    this.getName() {
        return name;
    }
};
Device.connect = function(outputDevice, inputDevice) {
    outputDevice.outputs.push(inputDevice);
    inputDevice.inputs.push(outputDevice);
};

//implementation
var a = new Device('a');
var b = new Device('b');
Device.connect(a, b);  

Device.connect はデバイスの出力および入力配列にアクセスできないため、これは機能していないようです。それを公開するデバイスに特権メソッド(pushToOutputsなど)を追加せずにそれらに到達する方法はありますか?

ありがとう!スティーブ。

4

2 に答える 2

2

Eugene Morozov は正しいです。関数内で変数をそのまま作成すると、これらの変数にアクセスできなくなります。ここでの私の通常のアプローチは、それらを の変数にすることですがthis、プライベートであることを明確にするために名前を付けます。

var Device = function(newName) {
    this._name = newName;
    this._inputs  = new Array();
    this._outputs = new Array();
    this.getName() {
        return this._name;
    }
};
Device.connect = function(outputDevice, inputDevice) {
    outputDevice._outputs.push(inputDevice);
    inputDevice._inputs.push(outputDevice);
};

//implementation
var a = new Device('a');
var b = new Device('b');
Device.connect(a, b);
于 2009-03-16T11:42:13.643 に答える
1

クロージャーを作成していますが、特権メソッドを使用する以外に、外部からクロージャー変数にアクセスする方法はありません。

率直に言って、特に Javascript コードでは、プライベート変数の必要性を感じたことはありません。だから私は気にせずにそれらを公開するつもりはありませんが、それは私の意見です.

于 2009-03-16T11:34:54.787 に答える