从技术上讲,JavaScript不支持私有成员作为语言功能。隐私-由道格拉斯·克罗克福德(Douglas Crockford)描述-而是通过闭包(保留的函数范围)进行仿真,该闭包将在构造函数的每个实例化调用中每次生成。
该Queue示例演示了如何使用构造函数来保留局部状态,并通过特权方法使局部状态也可访问。
class Queue { constructor () { // -会在每次实例化时生成一个闭包。 const list = []; // - local state ("private member"). this.enqueue= function (type) { // -特权公共方法 // 访问本地状态 list.push(type); // "writing" alike. return type; }; this.dequeue= function () { // -特权公共方法 // 访问本地状态 return list.shift(); // "reading / writing" alike. }; } } var q = new Queue; // // q.enqueue(9); // ...首先... q.enqueue(8); // q.enqueue(7); // // console.log(q.dequeue()); // 9 ...先出来。 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
使用这种模式-通过特权的公共方法模拟私有成员-应该记住,对于每个实例,每个自己的属性方法都将占用额外的内存(因为该代码无法共享/重用)。对于将要存储在此类闭包中的状态数量/大小,情况也是如此。