2

私はJavaScriptでオブジェクト指向プログラミングを使おうとしているC#開発者です。次のコードの場合

var np =  np || {};

 np.Class1 = function () {

    var var1,
        var2,
        var3;

    var init = function(a) {
        var1 = a;
        this.var2 = a;
        init3(a);
    };

    var init3 = function(b) {
        this.var3 = b;
    };

    return {
        init: init,
        var1: var1,
        var2: var2,
        var3: var3
    };
};

var t = new np.Class1();
t.init("t");
console.log("var1 " + t.var1);
console.log("var2 " + t.var2);
console.log("var3 " + t.var3);

私が得ている:

 var1 undefined 
 var2 t 
 var3 undefined 

プライベート変数にアクセスできる唯一の方法Class1はを使用するthis.var2 = a;ことですが、他の関数から呼び出される関数では機能しません。関数からプライベート変数にアクセスするにはどうすればよいinit3()ですか?

編集済み

init3()このように機能を変えても

var init3 = function(b) {
  var3 = b;
};

結果は同じです。したがって、質問はまだ有効です。関数からプライベート変数を操作するにはどうすればよいですか?

4

3 に答える 3

0

var3返されたオブジェクトでローカルを公開していますが、それを何にも設定することはありません。あなたは今までに設定しただけthis.var3です。var3 = b値を返すように設定する必要があります。

さらに、それらを非公開にすることを意図している場合、なぜそれらを直接公開するのですか?オブジェクトのプライベート状態を操作する関数を公開しませんか(オブジェクト指向を目指しているため)。

于 2013-02-09T23:08:17.050 に答える
0

使用するのではなく:

init3(a);

試す:

init3.call(this, a);

なんで?を使用するinit3(a)と、thisはグローバルオブジェクトに設定されます(windowブラウザ環境の場合)。関数のcallメソッドを使用すると、別の設定thisを行うことができます。この場合、私たちは自分たちのthis価値を広めたいだけです。

于 2013-02-09T23:25:55.240 に答える
0

返品明細

return {
        init: init,
        var1: var1,
        var2: var2,
        var3: var3
    };

は、変数の初期値(init実行前)を公開しています(返されたオブジェクトのプロパティとして設定) undefinedvar2後で、を設定して公開された値を上書きし、this.var2 = aに対して同様のことを実行しようとしますが、(前の回答で述べたように)内がを参照してvar3いるため、機能しません。したがって、オブジェクトのプロパティは未定義のままで、変更されるだけです。thisinit3windowvar1var3var2

これらの変数がオブジェクト(配列や関数をそのまま含むinit)の場合、値ではなく参照によって渡されるため、console.log("var1 " + t.var1);etcなどの出力は初期値ではなく現在の値を表します。

説明のために、これを試してください

np.Class1 = function () {
    var someVariables = {},
        self;

    var init = function(a) {
        self = this; // self now refers to the object from which init was called
        someVariables.var1 = a;
        this.var2 = a;
        init3(a);
    };

    var init3 = function(b) {
        self.var3 = b;
    };

    return {
        init: init,
        vars: someVariables
    };
};

var t = new np.Class1();
t.init("t");
console.log("var1 " + t.vars.var1); // 't'
console.log("var2 " + t.var2); // 't'
console.log("var3 " + t.var3); // 't'
var newObj = {init: t.init}
newObj.init(true);
console.log(newObj); // Object {init: function, var2: true, var3: true}
于 2013-02-10T00:01:52.347 に答える