私人會員

從技術上講,JavaScript 不支援私有成員作為語言功能。隱私 - 由道格拉斯·克羅克福德(Douglas Crockford)描述 - 通過閉包(保留的函式範圍)進行模擬,閉包(每個例項化函式的每個例項化呼叫都將生成)。

Queue 示例演示瞭如何使用建構函式,通過特權方法保留本地狀態並使其可訪問。

class Queue {

  constructor () {                    // - does generate a closure with each instantiation.

    const list = [];                  // - local state ("private member").

    this.enqueue = function (type) {  // - privileged public method
                                      //   accessing the local state
      list.push(type);                //   "writing" alike.
      return type;
    };
    this.dequeue = function () {      // - privileged public method
                                      //   accessing the local state
      return list.shift();            //   "reading / writing" alike.
    };
  }
}

var q = new Queue;            //
                              //
q.enqueue(9);                 // ... first in ...
q.enqueue(8);                 //
q.enqueue(7);                 //
                              //
console.log(q.dequeue());     // 9 ... first out.
console.log(q.dequeue());     // 8
console.log(q.dequeue());     // 7
console.log(q);               // {}
console.log(Object.keys(q));  // ["enqueue","dequeue"]

對於 Queue 型別的每個例項化,建構函式都會生成一個閉包。

因此,Queue 型別自己的方法 enqueuedequeue(參見 Object.keys(q))仍然可以訪問 list,它繼續生活在其建造時儲存的封閉範圍內。

利用這種模式 - 通過特權公共方法模擬私有成員 - 應該記住,對於每個例項,每個自己的屬性方法都會消耗額外的記憶體 (因為它是無法共享/重用的程式碼)。對於將要儲存在這種閉包中的狀態的數量/大小也是如此。