美文网首页工作生活
使用 Symbol 实现私有属性与方法

使用 Symbol 实现私有属性与方法

作者: SingleDiego | 来源:发表于2019-07-04 11:30 被阅读0次

参考:https://www.jianshu.com/p/f40a77bbd74e




ES6 中引入了一种新的基础数据类型:Symbol,它的功能类似于一种标识唯一性的 ID。

每一个 Symobl 实例都是唯一的,因此,当你比较两个 Symbol 实例的时候,将总会返回 false

Symbol() === Symbol()
// false

由于 Symbol 是一种基础数据类型,所以当我们使用 typeof 去检查它的类型的时候,它会返回一个属于自己的类型 symbol,而不是什么 stringobject 之类。

let s = Symbol()
typeof(s)
// "symbol"




利用 Symbol 的属性,我们可以实现类的私有变量与私有方法。

const _radius = Symbol();

class Circle {
  constructor(radius) {
    this[_radius] = radius;
  };
}

let c = new Circle(1);

把实例 c 打印出来看看:

Circle {Symbol(): 1}
Symbol(): 1
__proto__: Object

属性名变成了 Symbol(),当我们用这个方法设置多个属性名时,外部看全部都是 Symbol(),但彼此之间是不同的。

这种属性在外部是不可见的:

Object.getOwnPropertyNames(c)
// []

Object,keys(c)
// []

我们查看 c 对象的属性只能得到一个空数组 []

要查看这类属性我们使用 getOwnPropertySymbols 方法:

Object.getOwnPropertySymbols(c)
// [Symbol()]




实现私有方法可用以下办法:

const _radius = Symbol();
const _draw = Symbol();

class Circle {
  constructor(radius) {
    // 私有属性
    this[_radius] = radius;
  };

  // 私有方法
  [_draw] () {
    console.log('draw');
  };
}

let c = new Circle(1);

相关文章

网友评论

    本文标题:使用 Symbol 实现私有属性与方法

    本文链接:https://www.haomeiwen.com/subject/azbkhctx.html