闭包
function MyClass() {
let privateVar = 'I am private'
let privateMethod = () => {
console.log('This is a private method')
}
this.publicMethod = () => {
console.log(privateVar)
privateMethod()
}
}
let myClass = new MyClass()
myClass.publicMethod()
闭包实现的私有变量和私有方法,外部是无法直接访问的,因为它们只存在于函数的内部作用域中,外部无法直接访问这个作用域。
symbol
let MyClass = (function() {
// 私有变量和私有方法的Symbol key
let privateVarKey = Symbol('privateVar');
let privateMethodKey = Symbol('privateMethod');
class MyClass {
constructor() {
// 私有变量
this[privateVarKey] = 'I am private';
// 私有方法
this[privateMethodKey] = function() {
console.log('This is a private method');
}
}
// 公有方法,可以访问私有变量和私有方法
publicMethod() {
console.log(this[privateVarKey]);
this[privateMethodKey]();
}
}
return MyClass;
})();
let myClass = new MyClass();
myClass.publicMethod(); // 输出: I am private, This is a private method
通过Symbol实现的私有变量和私有方法,虽然外部无法直接通过属性名访问,但是可以通过Object.getOwnPropertySymbols()方法获取到对象的所有Symbol属性,然后通过这些Symbol属性访问私有变量和私有方法。
let symbols = Object.getOwnPropertySymbols(myClass);
console.log(myClass[symbols[0]]); // 输出: I am private
myClass[symbols[1]](); // 输出: This is a private method