Javascript公共方法参数作为私有变量

时间:2012-09-24 01:23:04

标签: javascript oop prototype

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

MyClass = function() {
    var myPrivateVar;

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

    this.someOtherPublicMethod() {
        somePrivateMethod();
    }

    function somePrivateMethod() {
        myPrivateVar++;
    }
}

3 个答案:

答案 0 :(得分: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++;
    }
};

答案 1 :(得分: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++;
}

答案 2 :(得分: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'