2

Symbol

  1. Symbol的特点

    • Symbol 是一种基础的数据类型。也就是说:使用typeof得到的是symbol类型。
    • 每个Symbol都是唯一的,所以当比较两个Symbol的时候,会得到false
    • Symbol值可以作为对象属性的标识符,这是Symbol存在的意义。
    // 'sym'是描述,跟值没有关系
    const sym = Symbol('sym') 
    console.log(typeof sym) // symbol
    
    const a = Symbol()
    const b = Symbol()
    console.log(a===b) // false 
    console.log(a==b) // false 
    
    const obj = {
      [Symbol()]: '姓名',
      age: 18
    }
  2. Symbol能做什么?

    1. Symbol定义一些 不希望别人访问的属性。

      • 上面已经说了Symbol可以作为对象属性的标识符,但是为什么要用呢?我们先看一个简单的例子。

      [Symbol()]: '姓名',
      age: 18
    }
    Object.keys(obj) // [ 'age' ]
    for(let key in obj) {
      console.log(key) // age
    }
    ```
  - 通过代码我们可以看到,通过Symbol定义的属性,是无法通过for in or Object.keys 查找的,这样我们就可以用Symbol定义一些 不希望别人访问的属性。同时我们可以通过以下方法进行查询
    ```js
    const obj = {
      [Symbol(1)]: '姓名1',
      [Symbol(2)]: '姓名2',
      age: 18
    }
    console.log(Object.getOwnPropertySymbols(obj)) // [ Symbol(1), Symbol(2) ]
    console.log(Reflect.ownKeys(obj)); // [ 'age', Symbol(1), Symbol(2) ]
    ```
2. 使用Symbol 定义私有的属性和方法
  ```js
  // 2.js
  const PASSWORD = Symbol()
  class Login {
      constructor(username, password) {
          this.username = username
          this[PASSWORD] = password
      }

      checkPassword(pwd) {
          return this[PASSWORD] === pwd
      }
  }
  module.exports = Login

  // 1.js
  const Login = require('./2.js')
  const PASSWORD = Symbol()
  const login = new Login('admin', '123456')
  console.log(login.checkPassword('123456')) // true
  console.log(login.username) // admin
  console.log(login['PASSWORD']) // undefined
  console.log(login[PASSWORD]) // undefined
  ```
  - 上面代码分两个模块,通过commonjs引入,利用Symbol的唯一性,实现私有属性。checkPassword已经检测当前的PASSWORD是123456,但是因为Symbol的唯一性,1.js模块无法生成相同的Symbol,所以访问不到这个属性。

VivenZZ
88 声望0 粉丝