我试图弄清楚如何在我的类上有一个私有实例变量,它由一个公共方法的参数设置。但在这种情况下;似乎在somePublicMethod myPrivateVar之外将是未定义的。如何实现我想做的事情?
MyClass = function() {
var myPrivateVar;
this.somePublicMethod(myPrivateVar) {
myPrivateVar = myPrivateVar //????
}
this.someOtherPublicMethod() {
somePrivateMethod();
}
function somePrivateMethod() {
myPrivateVar++;
}
}
答案 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属性将是私有的。但是,公开setBar
和getBar
方法仍然可以访问它。
var inst = new MyClass;
console.log( inst.bar ); // undefined
console.log( inst.getBar() ); // 'private'
inst.setBar( 'accessible' );
console.log( inst.getBar() ); // 'accessible'