js实现私有变量和私有方法

66 阅读1分钟

闭包

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