JavaScript 私人会员

示例

从技术上讲,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

使用这种模式-通过特权的公共方法模拟私有成员-应该记住,对于每个实例,每个自己的属性方法都将占用额外的内存(因为该代码无法共享/重用)。对于将要存储在此类闭包中的状态数量/大小,情况也是如此。