私有变量:只能在类的内部访问的变量,无法在外部访问
实现私有变量的方式:
(一)约定命名
class A {
constructor(x) {
this._x = x;
}
showX() {
return this._x;
}
}
console.log(a._x); // abc
console.log(a.showX()); // abc
优点:简单、快捷
缺点:可以通过 for ... in 访问到
(二)闭包
class B {
constructor(x) {
let _x = x;
this.showX = function () {
return _x;
}
}
}
let b = new B('instanceB');
console.log(b._x); // undefined
console.log(b.showX());// instanceB
优点:从本质上解決私有变量问题
缺点:
- 私有变量的方法不能定义到原型链上,只能定义到构造函数(实例)上。
- 增加了额外的性能开销
- 构造函数中包含方法,后期维护困难
(三)立即执行函数
let C = (function() {
let _x;
class C {
constructor(x) {
_x = x;
}
showX() {
return _x;
}
}
return C;
}());
let c = new C('ccc');
console.log(c._x); //undefined
console.log(c.showX()); //ccc
优点:解決了闭包的问题
缺点:带来了一点额外的性能开销
(四)利用 symbol 特性
let _y = Symbol('y');
class D{
constructor(x) {
this[_y] = x;
}
showY() {
return this[_y];
}
}
let d = new D('test');
console.log(d._y); //undefined
console.log(d.showY()); //test