2012-09-24 30 views
1

我想弄清楚如何有一個私人實例變量在我的類獲取通過公共方法的參數設置。但在這種情況下,似乎在某些PublicMethod myPrivateVar之外將是未定義的。怎樣才能實現我想要做的事情?作爲私人增值業務的Javascript公共方法參數

MyClass = function() { 
    var myPrivateVar; 

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

    this.someOtherPublicMethod() { 
     somePrivateMethod(); 
    } 

    function somePrivateMethod() { 
     myPrivateVar++; 
    } 
} 

回答

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++; 
    } 
}; 
+0

該解決方案可以正常工作,但當我不得不爲輸入變量使用不同的名稱時,它並不太優雅。 – prettymuchbryce

+1

@prettymuchbryce優雅與否,你不能在不同範圍內聲明2個具有相同名稱的變量,並且仍然可以同時達到這兩個變量。重命名或包含一個(請參閱後者的編輯)。 –

+0

好吧,夠公平的。我喜歡當地人的解決方案。謝謝。 – prettymuchbryce

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++; 
} 
+0

您的回答很好,但不適合這種特殊情況。看我更新的例子,看看爲什麼。 – prettymuchbryce

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'