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 回答