1

これが私のモジュールです:

MyModule = (function () {

    var myModule = function MyModule(strInput) {
        if (false === (this instanceof MyModule)) {
            return new MyModule();
        }

        str = strInput;
    }

    var str;
    myModule.prototype.getStr = function () {
        return str;
    }

    myModule.prototype.test = function () {
        var testModule = new MyModule("testInside");
        console.log(testModule.getStr());
        console.log(str);
    }

    return myModule;
}());

モジュールをテストする方法は次のとおりです。

document.getElementById("Button").onclick = function () {    
        var module = new MyModule("input");    
        module.test();    
    }

このコードは次を返します:

testInside   
testInside 

console.logに追加しますが、私が期待するのは次のとおりです。

testInside    
input    

同じクラス内に新しいクラスを作成するときのc#やjavaのように。

4

2 に答える 2

0

strを返すクロージャ内に格納されている変数ですMyModule。これはオブジェクトのプロパティではなく、のすべてのインスタンス間で共有されますMyModule

を呼び出すときは.test()、上書きします。

オブジェクトに関連付けたい場合は、オブジェクトに配置します。

//...
var myModule = function MyModule(strInput) {
    // ...
    this.str = strInput;
}
//...
myModule.prototype.getStr = function () {
    return this.str;
//...
    console.log(testModule.getStr());
    console.log(this.str);
//...
于 2012-05-07T08:50:34.753 に答える
0

プライベートを維持したい場合は、次のstrようにすることができます。

MyModule = (function () {

    var myModule = function MyModule(strInput) {
        if (false === (this instanceof MyModule)) {
            return new MyModule();
        }

        var str = strInput;

        this.getStr = function () {
            return str;
        };

        this.test = function () {
            var testModule = new MyModule("testInside");
            console.log(testModule.getStr());
            console.log(str);
        };
    };

    return myModule;
}());

このように、strは内部クロージャにあるため、他の言語のインスタンス/オブジェクト変数のようになります。外側のクロージャーに入れると、静的/クラス変数のように機能します。どちらの場合も、myModuleオブジェクトのメソッドは引き続きアクセスできますが、外部からは見えません。

于 2012-05-07T09:51:51.510 に答える