私人會員
從技術上講,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
型別自己的方法 enqueue
和 dequeue
(參見 Object.keys(q)
)仍然可以訪問 list
,它繼續生活在其建造時儲存的封閉範圍內。
利用這種模式 - 通過特權公共方法模擬私有成員 - 應該記住,對於每個例項,每個自己的屬性方法都會消耗額外的記憶體 (因為它是無法共享/重用的程式碼)。對於將要儲存在這種閉包中的狀態的數量/大小也是如此。