2016-05-17 50 views
0

我是新來的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應該是什麼樣的生命週期?
+1

閉包與函數或塊範圍無關。該函數是在'_aNumber'存在的範圍內定義的,這就是重要的。 *「似乎這個私人領域甚至可以繼承」*那真的。變量沒有「繼承」的概念。什麼是「繼承」是你分配給'this.aNumber'的函數。並且該函數可以訪問名爲「_aNumber」的變量。 –

+0

ES6中沒有「私人領域」這樣的東西。當然你可以使用閉包變量,但它們只是變量。順便說一句,這裏沒有什麼區別,不管你是用'let','var'還是用構造函數參數聲明它們。 – Bergi

+0

[JavaScript關閉如何工作?](http://stackoverflow.com/q/111102/1048572) – Bergi

回答

1

您的_aNumber(聲明爲let _aNumber = aNumber)不在類範圍之外。如果您嘗試執行console.log(_aNumber),則會得到undefined

但是JavaScript有一些叫做closures的東西,它可以「凍結」函數中的變量。這意味着當你調用你的課程的aNumber方法時,let變量仍然存在於該函數中。

此外,由於JavaScript函數是一流,分配this.aNumber的值是完全等同於分配this.aNumber到一個函數,返回一個值,然後調用該函數。

例如,

let a = 'foo'; 
let b = function() { 
    return 'foo'; 
}; 

b(); 

console.log(a); // foo 
console.log(b); // foo 

這是艱難的,說如果你是「做正確」因爲我不完全相信你會什麼。但瞭解更多關於關閉first-class functions可能會幫助您更好地掌握變量的生命週期和變量賦值的性質。

+0

嗨,謝謝。從console.log獲取undefined(privateTest._aNumber)正是我想要的,因爲我正在尋找使用新ES6類的私有字段的模式。我的問題是,如果私有「let聲明變量」在構造函數完成執行後將繼續存在,因爲我在這裏閱讀http://es6-features.org/#BlockScopedVariables,用let聲明的變量是「block scoped 」。 – nbloqs