使用Symbol创建私有属性

该文章发布于 ,归类于 Javascript 0 条评论

es6类中没有提供私有属性、私有方法这些概念,之前的写法,使用下划线表示一个方法是私有的,但是,在外部仍然是可以被访问到的,并没有起到真正私有的目的。

var Person = (function () {
  function Person (name, age) {
    this.name = name;
    this.age = age;
  }

  Person.prototype.getAge = function () {
    return this.age;
  }

  Person.prototype._setAge = function (age) {
    this.age = age
  }

  return Person;

})();

这里的_setAge只是起到了说明私有的目的,并不能真正的私有化。

在es6中引入了Symbol,表示独一无二的值,我们可以使用它来实现属性和方法的私有化。

const [setName, setAge] = [Symbol('setName'), Symbol('setAge')],
  privateData = new WeakMap()

class Person {
  constructor (name, age) {
    privateData.set(this, { name, age })
  }

  [setName] (name) {
    privateData.get(this).name = name
  }

  [setAge] (age) {
    privateData.get(this).age = age
  }

  getAge () {
    return privateData.get(this).age
  }

  getName () {
    return privateData.get(this).name
  }
}

export default Person

上面的Person类中,setNamesetAge就是私有的方法,在类的内部,我们可以自由调用,例如在getAge之前,总是设置age值为12可以如下方式调用。

getAge () {
  this[setAge](12)
  return privateData.get(this).age
}

但是,在外部,是无法进行调用的,正是因为每一个Symbol的值都是唯一的这一特性,所以无法访问类内部创建的Symbol属性。

相关文章