1. 程式人生 > >class定義私有屬性和私有方法

class定義私有屬性和私有方法

私有方法和私有屬性,是隻能在類的內部訪問的方法和屬性,外部不能訪問。
但 ES6 不提供,只能通過變通方法模擬實現

下面是私有方法和私有屬性暴露的例子

  class Foo {
    //公有方法
    foo (baz) {
      this._bar(baz);
    }

    //私有方法
    _bar(baz) {
      return this.baz = baz;
    }
  }

  const instance = new Foo();
  instance.foo(1);
  instance.baz; //1
  instance._bar(2); //2
  instance.baz; //2

解決方案一
將私有方法移出模組,因為模組內部的所有方法都是對外可見的

  class Foo {
    // 公有方法
    foo(baz) {
      _bar.call(this, baz);
    }
  }

  function _bar(baz) {
    return this.baz = baz;
  }

  const instance = new Foo();
  instance.foo(1); 
  instance; //{baz: 1}
  instance._bar(); //Uncaught TypeError: instance1.bar is not a function

解決方法二
利用Symbol值的唯一性,將私有方法的名字命名為一個Symbol值,導致第三方無法獲取到它們,因此達到了私有方法和私有屬性的效果。

  const bar = Symbol('bar');
  const baz = Symbol('baz');

  export default class Foo {
    //公有方法
    foo (baz) {
      this[bar](baz);
    }

    //私有方法
    [bar](baz) {
      return this[baz] = baz;
    }
  }