JavaScript 的闭包与私有变量
用闭包在 JavaScript 里实现 private。
发布 2017年4月13日 标签
#javascript
#closures
~/posts/closure-and-private $ cat post.md
JavaScript 中的”私有”
JS 是面向对象的,那对象自然也想有”私有”这种东西。别的语言都有现成办法:C++ 有 public: 和 private:,Java 有 private / protected / friendly。JS 怎么做?
为什么要做这个
- 封装做得好,耦合就少。
- 类内部结构可以自由修改,外部感知不到。
- 对成员可以做更精确的访问控制。
- 隐藏实现细节。
对独立的小项目来说,除了”继承时不污染”和”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; 再用。)
技术点本身很简单,更值得想清楚的其实是”为什么要这么做”。