返回首页

JavaScript 的闭包与私有变量

用闭包在 JavaScript 里实现 private。

发布 2017年4月13日 标签 #javascript #closures

~/posts/closure-and-private $ cat post.md

/ 语言 EN / 中文
/ 主题 / /

JavaScript 中的”私有”

JS 是面向对象的,那对象自然也想有”私有”这种东西。别的语言都有现成办法:C++ 有 public:private:,Java 有 private / protected / friendly。JS 怎么做?

为什么要做这个

  1. 封装做得好,耦合就少。
  2. 类内部结构可以自由修改,外部感知不到。
  3. 对成员可以做更精确的访问控制。
  4. 隐藏实现细节。

对独立的小项目来说,除了”继承时不污染”和”API 表面干净”以外,private 的价值有限。但一旦要做权限或边界控制,它就有用了。

JavaScript 里的实现

function Container(param) {
    this.member = param;
}

const myContainer = new Container("abc");

这样 myContainer.member 就是 "abc"——构造器模式建一个对象,其他几种构建对象的方式效果是一样的。

JS 用 let / var 声明的变量是有作用域的。利用这个特点可以做出带私有变量的对象:

function Container(param) {
    let member = param;
}

const myContainer = new Container("abc");

但这样的变量外部根本访问不到,得给它一个访问器:

function Container(param) {
    let member = param;
    return () => member;
}

const myContainer = new Container("abc");

或者把访问器挂到外部变量上:

let get = null;

function Container(param) {
    let member = param;
    get = () => member;
}

const myContainer = new Container("abc");

(严格模式下,记得先在外层声明 let get = null; 再用。)

技术点本身很简单,更值得想清楚的其实是”为什么要这么做”。

返回首页