我是新來的JS,所以我試圖找到具有的ECMAScript 6JS/ECMAScript6私有字段與模式?
私人領域我使用的Node.js(最新版本)運行ES6的類的良好格局。我想出了下面的代碼片段,但我不明白爲什麼一個變量,令(這在我的可能,不正確認識僅阻斷ES6範圍)的塊已被執行後會生存聲明:
class PrivateTest {
constructor(aNumber) {
let _aNumber = aNumber;
//Privileged setter/getter with access to private _number:
this.aNumber = function(value) {
if (value !== undefined && (typeof value === typeof _aNumber)) {
_aNumber = value;
}
else {
return _aNumber;
}
}
}
}
const privateTest = new PrivateTest(99);
console.log(privateTest.aNumber());
privateTest.aNumber(86);
console.log(privateTest.aNumber());
console.log(privateTest._aNumber); //Undefined.
// Just to try inheritance:
class PrivateTest2 extends PrivateTest {
}
const privateTest2 = new PrivateTest2(13);
console.log(privateTest2.aNumber());
輸出是這樣的:
99
86
undefined
13
從上面的代碼,似乎這是私人領域,甚至可以繼承。
所以問題是:
- 我這樣做對嗎?
- _number應該是什麼樣的生命週期?
閉包與函數或塊範圍無關。該函數是在'_aNumber'存在的範圍內定義的,這就是重要的。 *「似乎這個私人領域甚至可以繼承」*那真的。變量沒有「繼承」的概念。什麼是「繼承」是你分配給'this.aNumber'的函數。並且該函數可以訪問名爲「_aNumber」的變量。 –
ES6中沒有「私人領域」這樣的東西。當然你可以使用閉包變量,但它們只是變量。順便說一句,這裏沒有什麼區別,不管你是用'let','var'還是用構造函數參數聲明它們。 – Bergi
[JavaScript關閉如何工作?](http://stackoverflow.com/q/111102/1048572) – Bergi