1

我试图弄清楚如何在我的类上拥有一个由公共方法的参数设置的私有实例变量。但是,在这种情况下;似乎在 somePublicMethod myPrivateVar 之外将是未定义的。怎样才能实现我想要做的事情?

MyClass = function() {
    var myPrivateVar;

    this.somePublicMethod(myPrivateVar) {
        myPrivateVar = myPrivateVar //????
    }

    this.someOtherPublicMethod() {
        somePrivateMethod();
    }

    function somePrivateMethod() {
        myPrivateVar++;
    }
}
4

3 回答 3

2

问题是您var myPrivateVar通过为参数提供相同的名称来隐藏 ,因此只有参数变量在范围内:

this.somePublicMethod = function(myPrivateVar) {
    myPrivateVar = myPrivateVar; // sets the argument to itself
}

您需要为其中之一指定不同的名称以避免阴影:

this.somePublicMethod = function(inputVar) {
    myPrivateVar = inputVar;
};

否则,您将需要以某种方式包含其中之一:

MyClass = function () {
    var locals = {
        myPrivateVar: null
    };

    this.somePublicMethod = function (myPrivateVar) {
        locals.myPrivateVar = myPrivateVar;
    };

    function somePrivateMethod() {
        locals.myPrivateVar++;
    }
};
于 2012-09-24T01:36:26.800 回答
1

使用this.myPrivateVar

this.somePublicMethod = function(myPrivateVar) {
    this.myPrivateVar = myPrivateVar;
}

要在 的上下文中调用私有方法this,可以使用:

this.somePublicMethod = function(myPrivateVar) {
    this.myPrivateVar = myPrivateVar;
    somePrivateMethod.call(this); // pass this as the context of the private method
}

function somePrivateMethod() {
    this.myPrivateVar++;
}
于 2012-09-24T01:26:04.060 回答
0

您是否考虑过采取稍微不同的路线?

var MyClass = function(){
    var bar = "private";
    return {
        setBar: function( newBar ) { bar = newBar; },
        getBar: function() { return bar; }
    }
};

当您新建此类的实例时, bar 属性将是私有的。但是,公众setBargetBar方法仍然可以访问它。

var inst = new MyClass;

console.log( inst.bar ); // undefined
console.log( inst.getBar() ); // 'private'

inst.setBar( 'accessible' );

console.log( inst.getBar() ); // 'accessible'
于 2012-09-24T02:23:33.223 回答